X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/82a0afa0b39d07cd57e9073ea63b561a9e589604..defb2d0579873df0006abf90ad742a85b34cfb08:/app/helpers/application_helper.rb diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 0a9596db18..d4cc4ec92d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,73 +1,5 @@ module ApplicationHelper - - ALL_PERMISSIONS = {read: true, write: true, manage: true} - def current_user controller.current_user end - - def invalidate_permissions_cache - Rails.cache.delete_matched(/^groups_for_user_/) - end - - def groups_i_can(verb) - current_group_permissions.select { |uuid, mask| mask[verb] }.keys - end - - def current_group_permissions - return {} unless current_user - Rails.cache.fetch "groups_for_user_#{current_user.uuid}" do - permissions_from = {} - todo = {current_user.uuid => true} - done = {} - while !todo.empty? - lookup_uuids = todo.keys - lookup_uuids.each do |uuid| done[uuid] = true end - todo = {} - Link.where('tail_uuid in (?) and link_class = ? and head_kind = ?', - lookup_uuids, - 'permission', - 'orvos#group').each do |link| - unless done.has_key? link.head_uuid - todo[link.head_uuid] = true - end - link_permissions = {} - case link.name - when 'can_read' - link_permissions = {read:true} - when 'can_write' - link_permissions = {read:true,write:true} - when 'can_manage' - link_permissions = ALL_PERMISSIONS - end - permissions_from[link.tail_uuid] ||= {} - permissions_from[link.tail_uuid][link.head_uuid] ||= {} - link_permissions.each do |k,v| - permissions_from[link.tail_uuid][link.head_uuid][k] ||= v - end - end - end - search_permissions(current_user.uuid, permissions_from) - end - end - - protected - - def search_permissions(start, graph, merged={}, upstream_mask=nil, upstream_path={}) - nextpaths = graph[start] - return merged if !nextpaths - return merged if upstream_path.has_key? start - upstream_path[start] = true - upstream_mask ||= ALL_PERMISSIONS - nextpaths.each do |head, mask| - merged[head] ||= {} - mask.each do |k,v| - merged[head][k] ||= v if upstream_mask[k] - end - search_permissions(head, graph, merged, upstream_mask.select { |k,v| v && merged[head][k] }, upstream_path) - end - upstream_path.delete start - merged - end - end