From 9ae871be66861037018c6d96ec1b5e337e2bf152 Mon Sep 17 00:00:00 2001 From: Daniel Munn Date: Wed, 13 Jun 2012 23:59:06 +0100 Subject: [PATCH] Introduce PUT method - file adding supported, work needed for better integration with windows Webdav --- lib/redmine_dmsf/webdav/dmsf_resource.rb | 66 +++++++++++++++++++++-- lib/redmine_dmsf/webdav/resource_proxy.rb | 10 +++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/lib/redmine_dmsf/webdav/dmsf_resource.rb b/lib/redmine_dmsf/webdav/dmsf_resource.rb index f55a2113..e50b84ca 100644 --- a/lib/redmine_dmsf/webdav/dmsf_resource.rb +++ b/lib/redmine_dmsf/webdav/dmsf_resource.rb @@ -169,13 +169,13 @@ module RedmineDmsf return MethodNotAllowed if exist? #If we already exist, why waste the time trying to save? parent_folder = nil if (parent.projectless_path != "/") - return MethodNotAllowed unless parent.folder? + return Conflict unless parent.folder? parent_folder = parent.folder.id end f = DmsfFolder.new({:title => basename, :dmsf_folder_id => parent_folder, :description => 'Folder created from WebDav'}) f.project = project f.user = User.current - f.save ? OK : MethodNotAllowed + f.save ? OK : Conflict else UnsupportedMediaType end @@ -334,6 +334,8 @@ module RedmineDmsf end end + # Lock + # Locks a file entity only (DMSF Folders do not support locking) def lock(args) return Conflict unless (parent.projectless_path == "/" || parent_exists?) && !collection? && file? token = UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, projectless_path).to_s @@ -348,10 +350,13 @@ module RedmineDmsf end end + # Unlock + # Token based unlock (authenticated) will ensure that a correct token is sent, further ensuring + # ownership of token before permitting unlock def unlock(token) return NoContent unless file? token=token.slice(1, token.length - 2) - if (token.nil? || token.empty?) + if (token.nil? || token.empty? || User.current.anonymous?) BadRequest else _token = UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, projectless_path).to_s @@ -364,6 +369,61 @@ module RedmineDmsf end end + # HTTP POST request. + # + # Forbidden, as method should not be utilised. + def post(request, response) + raise Forbidden + end + + # + # + def put(request, response) + filename = DmsfHelper.temp_dir+'/'+DmsfHelper.temp_filename(basename).gsub(/[\/\\]/,'') + raise BadRequest unless (!collection?) + new_revision = DmsfFileRevision.new + if (exist? && file?) #We're over-writing something, so ultimately a new revision + f = file + last_revision = file.last_revision + new_revision.source_revision = last_revision + new_revision.major_version = last_revision.major_version + new_revision.minor_version = last_revision.minor_version + new_revision.workflow = last_revision.workflow + else + raise BadRequest unless ( parent.projectless_path == "/" || (parent.exist? && parent.folder?) ) + f = DmsfFile.new + f.project = project + f.name = basename + f.folder = parent.folder + f.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? + new_revision.minor_version = 0 + new_revision.major_version = 0 + end + + new_revision.project = project + new_revision.folder = parent.folder + new_revision.file = f + new_revision.user = User.current + new_revision.name = basename + new_revision.title = DmsfFileRevision.filename_to_title(basename) + new_revision.description = nil + new_revision.comment = nil + new_revision.increase_version(2, true) + new_revision.mime_type = Redmine::MimeType.of(new_revision.name) + new_revision.size = request.body.length + raise InternalServerError unless new_revision.valid? && f.save + new_revision.disk_filename = new_revision.new_storage_filename + + if new_revision.save + f.reload + new_revision.copy_file_content(request.body) + else + raise InternalServerError + end + + Created + end + private # Prepare file for download using Rack functionality: # Download (see RedmineDmsf::Webdav::Download) extends Rack::File to allow single-file diff --git a/lib/redmine_dmsf/webdav/resource_proxy.rb b/lib/redmine_dmsf/webdav/resource_proxy.rb index b3cdf762..65beab64 100644 --- a/lib/redmine_dmsf/webdav/resource_proxy.rb +++ b/lib/redmine_dmsf/webdav/resource_proxy.rb @@ -95,13 +95,21 @@ module RedmineDmsf end def lock_check(*args) - @resource_c.check_lock(*args) + @resource_c.lock_check(*args) end def unlock(*args) @resource_c.unlock(*args) end + def put(*args) + @resource_c.put(*args) + end + + def post(*args) + @resource_c.post(*args) + end + def resource @resource_c end