From 04064a9c9830031af36676f66a981f0fd2d99fba Mon Sep 17 00:00:00 2001 From: Daniel Munn Date: Wed, 11 Jul 2012 15:23:32 +0100 Subject: [PATCH] Webdav R/RW functionality introduced --- app/views/settings/_dmsf_settings.erb | 15 ++++++++++++++- config/locales/en.yml | 5 ++++- lib/redmine_dmsf/webdav/dmsf_resource.rb | 19 ++++++++++++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/app/views/settings/_dmsf_settings.erb b/app/views/settings/_dmsf_settings.erb index 1094f4b9..822508b1 100644 --- a/app/views/settings/_dmsf_settings.erb +++ b/app/views/settings/_dmsf_settings.erb @@ -91,9 +91,22 @@ (<%=l(:label_default)%>: <%=l(:select_option_activated)%>)
<%= l(:note_webdav).html_safe %> -

+<% if @settings["dmsf_webdav"].nil? || !@settings["dmsf_webdav"].empty? %> +

+ <%=content_tag(:label, l(:label_webdav_strategy) + ":") %> + <%=select_tag("settings[dmsf_webdav_strategy]", + options_for_select([ + [l(:select_option_webdav_readonly), "WEBDAV_READ_ONLY"], + [l(:select_option_webdav_readwrite), "WEBDAV_READ_WRITE"]], + :selected => @settings["dmsf_webdav_strategy"])) %>
+ (<%=l(:label_default)%>: <%=l(:select_option_webdav_readonly)%>) +
+ <%= l(:note_webdav_strategy).html_safe %> +

+<% end %> +
<% begin diff --git a/config/locales/en.yml b/config/locales/en.yml index b1b5f52d..e15f1a0c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -203,4 +203,7 @@ en: :title_unlock_folder: "Unlock to allow changes for other members" :title_lock_folder: "Lock to prevent changes for other members" - + :select_option_webdav_readonly: "Read-only" + :select_option_webdav_readwrite: "Read/Write" + :label_webdav_strategy: "Webdav strategy" + :note_webdav_strategy: "Enables the administrator to decide if webdav is a read-only or read-write platform for end users." diff --git a/lib/redmine_dmsf/webdav/dmsf_resource.rb b/lib/redmine_dmsf/webdav/dmsf_resource.rb index 08efc576..e9d48794 100644 --- a/lib/redmine_dmsf/webdav/dmsf_resource.rb +++ b/lib/redmine_dmsf/webdav/dmsf_resource.rb @@ -27,6 +27,21 @@ module RedmineDmsf @folder = false end + #Here we make sure our folder and file methods are not aliased - it should shave a few cycles off of processing + def setup + @skip_alias |= [ :folder, :file, :folder?, :file? ] + end + + # Here we hook into the fact that resources can have a pre-execution routine run for them + # Our sole job here is to ensure that any write functionality is restricted to relevent configuration + before do |resource, method_name| + #If our method is not one of the following, there is no point continuing. + if [ :put, :make_collection, :move, :copy, :delete, :lock, :unlock, :set_property ].include?(method_name) + webdav_setting = Setting.plugin_redmine_dmsf["dmsf_webdav_strategy"] + webdav_setting = "WEBDAV_READ_ONLY" if webdav_setting.nil? + raise BadGateway if webdav_setting == "WEBDAV_READ_ONLY" + end + end # Gather collection of objects that denote current entities child entities # Used for listing directories etc, implemented basic caching because otherwise @@ -189,7 +204,7 @@ module RedmineDmsf end OK end - + # Process incoming MKCOL request # # Create a DmsfFolder at location requested, only if parent is a folder (or root) @@ -548,8 +563,6 @@ module RedmineDmsf %w(creationdate displayname getlastmodified getetag resourcetype getcontenttype getcontentlength supportedlock lockdiscovery) end - - private # Prepare file for download using Rack functionality: # Download (see RedmineDmsf::Webdav::Download) extends Rack::File to allow single-file