redmine_dmsf/lib/dav4rack/interceptor_resource.rb
2024-11-18 17:55:46 +01:00

119 lines
2.5 KiB
Ruby

# frozen_string_literal: true
module Dav4rack
# Interceptor resource
class InterceptorResource < Resource
attr_reader :path, :options
def initialize(*args)
super
@root_paths = @options[:mappings].keys
@mappings = @options[:mappings]
end
def children
childs = @root_paths.grep(/^#{Regexp.escape(@path)}/)
childs.map { |a| child a.gsub(/^#{Regexp.escape(@path)}/, '').split('/').delete_if(&:empty?).first }.flatten
end
def collection?
true if exist?
end
def exist?
!@root_paths.grep(/^#{Regexp.escape(@path)}/).empty?
end
def creation_date
Time.current
end
def last_modified
Time.current
end
def last_modified=(time)
# Nothing to do
end
def etag
Digest::SHA1.hexdigest @path
end
def content_type
'text/html'
end
def content_length
0
end
def get(_request, _response)
raise Forbidden
end
def put(_request)
raise Forbidden
end
def post(_request, _response)
raise Forbidden
end
def delete
raise Forbidden
end
def copy(_dest)
raise Forbidden
end
def move(_dest)
raise Forbidden
end
def make_collection
raise Forbidden
end
def ==(other)
path == other.path
end
def name
::File.basename path
end
def display_name
::File.basename path.to_s
end
def child(name, options = {})
new_path = path.dup
new_path = "/#{new_path}" unless new_path[0, 1] == '/'
new_path.slice!(-1) if new_path[-1, 1] == '/'
name = "/#{name}" unless name[-1, 1] == '/'
new_path = "#{new_path}#{name}"
new_public = public_path.dup
new_public = "/#{new_public}" unless new_public[0, 1] == '/'
new_public.slice!(-1) if new_public[-1, 1] == '/'
new_public = "#{new_public}#{name}"
if (key = @root_paths.find { |x| new_path =~ %r{^#{Regexp.escape(x.downcase)}/?} })
@mappings[key][:resource_class].new(new_public, new_path.gsub(key, ''), request, response,
{ root_uri_path: key, user: @user }.merge(options).merge(@mappings[key]))
else
self.class.new new_public, new_path, request, response, { user: @user }.merge(options)
end
end
def descendants
list = []
children.each do |child|
list << child
list.concat(child.descendants)
end
list
end
end
end