If a user clicks on the LFS object, it should be served if the user has access to the object.
This commit is contained in:
parent
6689224a90
commit
0a081e7eff
2 changed files with 27 additions and 0 deletions
|
@ -17,6 +17,7 @@ class Projects::BlobController < Projects::ApplicationController
|
||||||
before_action :require_branch_head, only: [:edit, :update]
|
before_action :require_branch_head, only: [:edit, :update]
|
||||||
before_action :editor_variables, except: [:show, :preview, :diff]
|
before_action :editor_variables, except: [:show, :preview, :diff]
|
||||||
before_action :after_edit_path, only: [:edit, :update]
|
before_action :after_edit_path, only: [:edit, :update]
|
||||||
|
before_action :show_lfs_object, only: :show
|
||||||
|
|
||||||
def new
|
def new
|
||||||
commit unless @repository.empty?
|
commit unless @repository.empty?
|
||||||
|
@ -193,4 +194,20 @@ class Projects::BlobController < Projects::ApplicationController
|
||||||
file_content_encoding: params[:encoding]
|
file_content_encoding: params[:encoding]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def show_lfs_object
|
||||||
|
return unless @blob && @blob.text? && @blob.data.present?
|
||||||
|
|
||||||
|
if @blob.data.starts_with?("version https://git-lfs.github.com/spec")
|
||||||
|
oid = @blob.data.match(/#{LfsObject::MATCH_FROM_POINTER_REGEX}/)
|
||||||
|
if oid && oid[1]
|
||||||
|
lfs_object = LfsObject.find_by_oid(oid[1])
|
||||||
|
return nil unless lfs_object && lfs_object.file.exists?
|
||||||
|
|
||||||
|
if lfs_object.projects.exists?(lfs_object.storage_project(@project).id)
|
||||||
|
send_file lfs_object.file.path, filename: @blob.name, disposition: 'attachment'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,4 +5,14 @@ class LfsObject < ActiveRecord::Base
|
||||||
validates :oid, presence: true, uniqueness: true
|
validates :oid, presence: true, uniqueness: true
|
||||||
|
|
||||||
mount_uploader :file, LfsObjectUploader
|
mount_uploader :file, LfsObjectUploader
|
||||||
|
|
||||||
|
MATCH_FROM_POINTER_REGEX = "(?<=sha256:)([0-9a-f]{64})"
|
||||||
|
|
||||||
|
def storage_project(project)
|
||||||
|
if project && project.forked?
|
||||||
|
project.forked_from_project
|
||||||
|
else
|
||||||
|
project
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue