@@ -324,51 +324,79 @@ function tube.on_task_change(self, cb)
324324 return old_cb
325325end
326326
327- function tube .grant (self , user , args )
328- if not check_state (" grant" ) then
329- return
327+ local function tube_grant_space (grantor , grantee , name , tp )
328+ grantor .grant (grantee , tp or ' read,write' , ' space' , name , {
329+ if_not_exists = true ,
330+ })
331+ end
332+
333+ local function tube_grant_func (grantor , grantee , name )
334+ box .schema .func .create (name , { if_not_exists = true })
335+ grantor .grant (grantee , ' execute' , ' function' , name , {
336+ if_not_exists = true
337+ })
338+ end
339+
340+ local function grant_system_spaces (grantor , grantee )
341+ tube_grant_space (grantor , grantee , ' _queue' , ' read' )
342+ tube_grant_space (grantor , grantee , ' _queue_consumers' )
343+ tube_grant_space (grantor , grantee , ' _queue_taken_2' )
344+ end
345+
346+ local function grant_args (grantor , grantee , args , name )
347+ if args .call then
348+ tube_grant_func (grantor , grantee , ' queue.identify' )
349+ tube_grant_func (grantor , grantee , ' queue.statistics' )
350+ local prefix = (args .prefix or ' queue.tube' ) .. (' .%s:' ):format (name )
351+ tube_grant_func (grantor , grantee , prefix .. ' put' )
352+ tube_grant_func (grantor , grantee , prefix .. ' take' )
353+ tube_grant_func (grantor , grantee , prefix .. ' touch' )
354+ tube_grant_func (grantor , grantee , prefix .. ' ack' )
355+ tube_grant_func (grantor , grantee , prefix .. ' release' )
356+ tube_grant_func (grantor , grantee , prefix .. ' peek' )
357+ tube_grant_func (grantor , grantee , prefix .. ' bury' )
358+ tube_grant_func (grantor , grantee , prefix .. ' kick' )
359+ tube_grant_func (grantor , grantee , prefix .. ' delete' )
330360 end
331- local function tube_grant_space ( user , name , tp )
332- box . schema . user . grant ( user , tp or ' read,write ' , ' space ' , name , {
333- if_not_exists = true ,
334- } )
361+
362+ if args . truncate then
363+ local prefix = ( args . prefix or ' queue.tube ' ) .. ( ' .%s: ' ): format ( name )
364+ tube_grant_func ( grantor , grantee , prefix .. ' truncate ' )
335365 end
366+ end
336367
337- local function tube_grant_func (user , name )
338- box .schema .func .create (name , { if_not_exists = true })
339- box .schema .user .grant (user , ' execute' , ' function' , name , {
340- if_not_exists = true
341- })
368+ function tube .grant (self , user , args )
369+ if not check_state (" grant" ) then
370+ return
342371 end
343372
344373 args = args or {}
345374
346- tube_grant_space (user , ' _queue' , ' read' )
347- tube_grant_space (user , ' _queue_consumers' )
348- tube_grant_space (user , ' _queue_taken_2' )
375+ grant_system_spaces (box .schema .user , user )
376+
349377 self .raw :grant (user , {if_not_exists = true })
350378 session .grant (user )
351379
352- if args .call then
353- tube_grant_func (user , ' queue.identify' )
354- tube_grant_func (user , ' queue.statistics' )
355- local prefix = (args .prefix or ' queue.tube' ) .. (' .%s:' ):format (self .name )
356- tube_grant_func (user , prefix .. ' put' )
357- tube_grant_func (user , prefix .. ' take' )
358- tube_grant_func (user , prefix .. ' touch' )
359- tube_grant_func (user , prefix .. ' ack' )
360- tube_grant_func (user , prefix .. ' release' )
361- tube_grant_func (user , prefix .. ' peek' )
362- tube_grant_func (user , prefix .. ' bury' )
363- tube_grant_func (user , prefix .. ' kick' )
364- tube_grant_func (user , prefix .. ' delete' )
380+ grant_args (box .schema .user , user , args , self .name )
381+ end
382+
383+ function tube .grant_role (self , role , args )
384+ if not check_state (" grant" ) then
385+ return
365386 end
366387
367- if args .truncate then
368- local prefix = (args .prefix or ' queue.tube' ) .. (' .%s:' ):format (self .name )
369- tube_grant_func (user , prefix .. ' truncate' )
388+ args = args or {}
389+
390+ if self .raw .grant_role ~= nil then
391+ self .raw :grant_role (role , { if_not_exists = true })
392+ else
393+ error ((' Tube %s driver does not support grant_role()' ):format (self .name ))
370394 end
371395
396+ grant_system_spaces (box .schema .role , role )
397+ session .grant_role (role )
398+
399+ grant_args (box .schema .role , role , args , self .name )
372400end
373401
374402-- methods
0 commit comments