Skip to content
Snippets Groups Projects
ability.rb 3.87 KiB
Newer Older
  • Learn to ignore specific revisions
  • gitlabhq's avatar
    gitlabhq committed
    class Ability
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
      class << self
    
        def allowed(user, subject)
          return [] unless user.kind_of?(User)
    
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
          case subject.class.name
    
          when "Project" then project_abilities(user, subject)
          when "Issue" then issue_abilities(user, subject)
          when "Note" then note_abilities(user, subject)
    
          when "ProjectSnippet" then project_snippet_abilities(user, subject)
    
          when "PersonalSnippet" then personal_snippet_abilities(user, subject)
    
          when "MergeRequest" then merge_request_abilities(user, subject)
          when "Group", "Namespace" then group_abilities(user, subject)
          when "UserTeam" then user_team_abilities(user, subject)
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
          else []
    
          end.concat(global_abilities(user))
        end
    
        def global_abilities(user)
          rules = []
          rules << :create_group if user.can_create_group
          rules << :create_team if user.can_create_team
          rules
    
    gitlabhq's avatar
    gitlabhq committed
        end
    
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
        def project_abilities(user, project)
          rules = []
    
    gitlabhq's avatar
    gitlabhq committed
    
    
          team = project.team
    
    
          if team.masters.include?(user)
    
          elsif team.developers.include?(user)
    
          elsif team.reporters.include?(user)
    
          elsif team.guests.include?(user) or project.public?
    
          if project.owner == user || user.admin?
    
            rules << project_admin_rules
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
            :read_project,
            :read_wiki,
            :read_issue,
            :read_milestone,
    
    Andrew8xx8's avatar
    Andrew8xx8 committed
            :read_project_snippet,
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
            :read_team_member,
            :read_merge_request,
            :read_note,
            :write_project,
            :write_issue,
    
    Dmitriy Zaporozhets's avatar
    Dmitriy Zaporozhets committed
    
    
        def project_report_rules
          project_guest_rules + [
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
            :download_code,
    
    Andrew8xx8's avatar
    Andrew8xx8 committed
            :write_project_snippet
    
    Dmitriy Zaporozhets's avatar
    Dmitriy Zaporozhets committed
    
    
        def project_dev_rules
          project_report_rules + [
    
        def project_master_rules
          project_dev_rules + [
            :push_code_to_protected_branches,
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
            :modify_issue,
    
    Andrew8xx8's avatar
    Andrew8xx8 committed
            :modify_project_snippet,
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
            :modify_merge_request,
            :admin_issue,
            :admin_milestone,
    
    Andrew8xx8's avatar
    Andrew8xx8 committed
            :admin_project_snippet,
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
            :admin_team_member,
            :admin_merge_request,
            :admin_note,
    
    gitlabhq's avatar
    gitlabhq committed
    
    
        def project_admin_rules
          project_master_rules + [
    
            :change_public_mode,
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
        end
    
    gitlabhq's avatar
    gitlabhq committed
    
    
        def group_abilities user, group
          rules = []
    
    
          # Only group owner and administrators can manage group
          if group.owner == user || user.admin?
            rules << [
    
              :manage_group,
              :manage_namespace
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
        def user_team_abilities user, team
          rules = []
    
    
          # Only group owner and administrators can manage team
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
          if team.owner == user || team.admin?(user) || user.admin?
            rules << [ :manage_user_team ]
          end
    
          if team.owner == user || user.admin?
            rules << [ :admin_user_team ]
          end
    
          rules.flatten
        end
    
    
        [:issue, :note, :project_snippet, :personal_snippet, :merge_request].each do |name|
    
    gitlabhq's avatar
    gitlabhq committed
          define_method "#{name}_abilities" do |user, subject|
            if subject.author == user
              [
                :"read_#{name}",
                :"write_#{name}",
    
                :"modify_#{name}",
    
    gitlabhq's avatar
    gitlabhq committed
                :"admin_#{name}"
              ]
    
            elsif subject.respond_to?(:assignee) && subject.assignee == user
              [
                :"read_#{name}",
                :"write_#{name}",
                :"modify_#{name}",
              ]
    
    gitlabhq's avatar
    gitlabhq committed
            else
    
    Andrey Kumanyaev's avatar
    Andrey Kumanyaev committed
              subject.respond_to?(:project) ? project_abilities(user, subject.project) : []
    
    gitlabhq's avatar
    gitlabhq committed
            end
          end
        end
      end
    
    gitlabhq's avatar
    gitlabhq committed
    end