summaryrefslogtreecommitdiff
path: root/app/controllers/concerns/lfs_request.rb
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-11-21 16:31:51 +0100
committerRémy Coutable <remy@rymai.me>2016-11-23 17:28:11 +0100
commit4b3c1e56ae7468d0234240dd211d54a7abd39f8f (patch)
treebbf92f08247ed2ed1863e153457232136013f1f7 /app/controllers/concerns/lfs_request.rb
parenta207c3d12f75644d72c7ea720949b8c58c89faa9 (diff)
downloadgitlab-ce-4b3c1e56ae7468d0234240dd211d54a7abd39f8f.tar.gz
Move LfsHelper to a new LfsRequest concern22253-move-lfshelper-methods-somewhere-else-than-app-helpers
Also create a new WorkhorseRequest concern Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'app/controllers/concerns/lfs_request.rb')
-rw-r--r--app/controllers/concerns/lfs_request.rb109
1 files changed, 109 insertions, 0 deletions
diff --git a/app/controllers/concerns/lfs_request.rb b/app/controllers/concerns/lfs_request.rb
new file mode 100644
index 00000000000..ed22b1e5470
--- /dev/null
+++ b/app/controllers/concerns/lfs_request.rb
@@ -0,0 +1,109 @@
+# This concern assumes:
+# - a `#project` accessor
+# - a `#user` accessor
+# - a `#authentication_result` accessor
+# - a `#can?(object, action, subject)` method
+# - a `#ci?` method
+# - a `#download_request?` method
+# - a `#upload_request?` method
+# - a `#has_authentication_ability?(ability)` method
+module LfsRequest
+ extend ActiveSupport::Concern
+
+ included do
+ before_action :require_lfs_enabled!
+ before_action :lfs_check_access!
+ end
+
+ private
+
+ def require_lfs_enabled!
+ return if Gitlab.config.lfs.enabled
+
+ render(
+ json: {
+ message: 'Git LFS is not enabled on this GitLab server, contact your admin.',
+ documentation_url: help_url,
+ },
+ status: 501
+ )
+ end
+
+ def lfs_check_access!
+ return if download_request? && lfs_download_access?
+ return if upload_request? && lfs_upload_access?
+
+ if project.public? || can?(user, :read_project, project)
+ lfs_forbidden!
+ else
+ render_lfs_not_found
+ end
+ end
+
+ def lfs_forbidden!
+ render_lfs_forbidden
+ end
+
+ def render_lfs_forbidden
+ render(
+ json: {
+ message: 'Access forbidden. Check your access level.',
+ documentation_url: help_url,
+ },
+ content_type: "application/vnd.git-lfs+json",
+ status: 403
+ )
+ end
+
+ def render_lfs_not_found
+ render(
+ json: {
+ message: 'Not found.',
+ documentation_url: help_url,
+ },
+ content_type: "application/vnd.git-lfs+json",
+ status: 404
+ )
+ end
+
+ def lfs_download_access?
+ return false unless project.lfs_enabled?
+
+ ci? || lfs_deploy_token? || user_can_download_code? || build_can_download_code?
+ end
+
+ def lfs_upload_access?
+ return false unless project.lfs_enabled?
+
+ has_authentication_ability?(:push_code) && can?(user, :push_code, project)
+ end
+
+ def lfs_deploy_token?
+ authentication_result.lfs_deploy_token?(project)
+ end
+
+ def user_can_download_code?
+ has_authentication_ability?(:download_code) && can?(user, :download_code, project)
+ end
+
+ def build_can_download_code?
+ has_authentication_ability?(:build_download_code) && can?(user, :build_download_code, project)
+ end
+
+ def storage_project
+ @storage_project ||= begin
+ result = project
+
+ loop do
+ break unless result.forked?
+ result = result.forked_from_project
+ end
+
+ result
+ end
+ end
+
+ def objects
+ @objects ||= (params[:objects] || []).to_a
+ end
+end