project_policy.rb 5.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
class ProjectPolicy < BasePolicy
  def project
    @subject
  end

  def guest_access!
    can! :read_project
    can! :read_board
    can! :read_list
    can! :read_wiki
    can! :read_issue
    can! :read_label
    can! :read_milestone
    can! :read_project_snippet
    can! :read_project_member
    can! :read_merge_request
    can! :read_note
    can! :create_project
    can! :create_issue
    can! :create_note
    can! :upload_file
  end

  def reporter_access!
    can! :download_code
    can! :fork_project
    can! :create_project_snippet
    can! :update_issue
    can! :admin_issue
    can! :admin_label
31
    can! :admin_list
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    can! :read_commit_status
    can! :read_build
    can! :read_container_image
    can! :read_pipeline
    can! :read_environment
    can! :read_deployment
  end

  def developer_access!
    can! :admin_merge_request
    can! :update_merge_request
    can! :create_commit_status
    can! :update_commit_status
    can! :create_build
    can! :update_build
    can! :create_pipeline
    can! :update_pipeline
    can! :create_merge_request
    can! :create_wiki
    can! :push_code
52
    can! :resolve_note
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
    can! :create_container_image
    can! :update_container_image
    can! :create_environment
    can! :create_deployment
  end

  def master_access!
    can! :push_code_to_protected_branches
    can! :update_project_snippet
    can! :update_environment
    can! :update_deployment
    can! :admin_milestone
    can! :admin_project_snippet
    can! :admin_project_member
    can! :admin_merge_request
    can! :admin_note
    can! :admin_wiki
    can! :admin_project
    can! :admin_commit_status
    can! :admin_build
    can! :admin_container_image
    can! :admin_pipeline
    can! :admin_environment
    can! :admin_deployment
  end

  def public_access!
    can! :download_code
    can! :fork_project
    can! :read_commit_status
    can! :read_pipeline
    can! :read_container_image
  end

  def owner_access!
    guest_access!
    reporter_access!
    developer_access!
    master_access!
    can! :change_namespace
    can! :change_visibility_level
    can! :rename_project
    can! :remove_project
    can! :archive_project
    can! :remove_fork_project
    can! :destroy_merge_request
    can! :destroy_issue
  end

  # Push abilities on the users team role
103 104
  def team_access!(user)
    access = project.team.max_member_access(user.id)
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

    return if access < Gitlab::Access::GUEST
    guest_access!

    return if access < Gitlab::Access::REPORTER
    reporter_access!

    return if access < Gitlab::Access::DEVELOPER
    developer_access!

    return if access < Gitlab::Access::MASTER
    master_access!
  end

  def archived_access!
    cannot! :create_merge_request
    cannot! :push_code
    cannot! :push_code_to_protected_branches
    cannot! :update_merge_request
    cannot! :admin_merge_request
  end

  def disabled_features!
    unless project.issues_enabled
      cannot!(*named_abilities(:issue))
    end

    unless project.merge_requests_enabled
      cannot!(*named_abilities(:merge_request))
    end

    unless project.issues_enabled or project.merge_requests_enabled
      cannot!(*named_abilities(:label))
      cannot!(*named_abilities(:milestone))
    end

    unless project.snippets_enabled
      cannot!(*named_abilities(:project_snippet))
    end

145
    unless project.has_wiki?
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
      cannot!(*named_abilities(:wiki))
    end

    unless project.builds_enabled
      cannot!(*named_abilities(:build))
      cannot!(*named_abilities(:pipeline))
      cannot!(*named_abilities(:environment))
      cannot!(*named_abilities(:deployment))
    end

    unless project.container_registry_enabled
      cannot!(*named_abilities(:container_image))
    end
  end

161 162
  def rules
    team_access!(user)
163

164 165 166
    owner = user.admin? ||
            project.owner == user ||
            (project.group && project.group.has_owner?(user))
167 168 169

    owner_access! if owner

170
    if project.public? || (project.internal? && !user.external?)
171 172 173 174 175 176 177
      guest_access!
      public_access!

      # Allow to read builds for internal projects
      can! :read_build if project.public_builds?

      if project.request_access_enabled &&
178
         !(owner || project.team.member?(user) || project_group_member?(user))
179 180 181 182 183 184 185 186 187
        can! :request_access
      end
    end

    archived_access! if project.archived?

    disabled_features!
  end

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
  def anonymous_rules
    return unless project.public?

    can! :read_project
    can! :read_board
    can! :read_list
    can! :read_wiki
    can! :read_label
    can! :read_milestone
    can! :read_project_snippet
    can! :read_project_member
    can! :read_merge_request
    can! :read_note
    can! :read_pipeline
    can! :read_commit_status
    can! :read_container_image
    can! :download_code

206 207 208
    # NB: may be overridden by IssuePolicy
    can! :read_issue

209 210 211 212 213 214 215
    # Allow to read builds by anonymous user if guests are allowed
    can! :read_build if project.public_builds?

    disabled_features!
  end

  def project_group_member?(user)
216 217
    project.group &&
    (
218 219
      project.group.members.exists?(user_id: user.id) ||
      project.group.requesters.exists?(user_id: user.id)
220 221 222 223 224 225 226 227 228 229 230 231
    )
  end

  def named_abilities(name)
    [
      :"read_#{name}",
      :"create_#{name}",
      :"update_#{name}",
      :"admin_#{name}"
    ]
  end
end