From e0cc6ef78b07b82916573db8e71118cf4d0c74d9 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Fri, 16 Oct 2020 15:51:00 +0200 Subject: [PATCH] #1179 sub-projects in square brackets --- app/helpers/dmsf_helper.rb | 4 +-- lib/redmine_dmsf/webdav/base_resource.rb | 25 +++++++++---------- lib/redmine_dmsf/webdav/project_resource.rb | 9 +++---- .../webdav/dmsf_webdav_delete_test.rb | 4 +-- .../webdav/dmsf_webdav_get_test.rb | 2 +- .../webdav/dmsf_webdav_mkcol_test.rb | 2 +- .../webdav/dmsf_webdav_move_test.rb | 4 +-- .../webdav/dmsf_webdav_options_test.rb | 2 +- .../webdav/dmsf_webdav_propfind_test.rb | 2 +- .../webdav/dmsf_webdav_put_test.rb | 4 +-- 10 files changed, 27 insertions(+), 31 deletions(-) diff --git a/app/helpers/dmsf_helper.rb b/app/helpers/dmsf_helper.rb index 1d9aa14c..0e3a4908 100644 --- a/app/helpers/dmsf_helper.rb +++ b/app/helpers/dmsf_helper.rb @@ -84,7 +84,7 @@ module DmsfHelper def webdav_url(project, folder) url = ["#{Setting.protocol}:/", Setting.host_name, 'dmsf', 'webdav'] if project - url << RedmineDmsf::Webdav::ProjectResource.create_project_name(project) + url << ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(project)) if folder folders = [folder] while folder.dmsf_folder do @@ -97,7 +97,7 @@ module DmsfHelper end end url << '' - URI.encode(url.join '/') + url.join '/' end end diff --git a/lib/redmine_dmsf/webdav/base_resource.rb b/lib/redmine_dmsf/webdav/base_resource.rb index a6a11865..58da4a0c 100644 --- a/lib/redmine_dmsf/webdav/base_resource.rb +++ b/lib/redmine_dmsf/webdav/base_resource.rb @@ -96,7 +96,7 @@ module RedmineDmsf Confict unless collection? entities = children.map{ |child| DIR_FILE % [ - uri_encode(request.url_for(child.path)), + uri_encode(request.url_for(child.path)), child.long_name || child.name, child.collection? ? '' : number_to_human_size(child.content_length), child.special_type || child.content_type, @@ -166,7 +166,7 @@ module RedmineDmsf protected def uri_encode(uri) - uri.gsub /[\(\)&]/, '(' => '%28', ')' => '%29', '&' => '&' + uri.gsub /[\(\)&\[\]]/, '(' => '%28', ')' => '%29', '&' => '%26', '[' => '%5B', ']' => '5D' end def basename @@ -188,9 +188,7 @@ module RedmineDmsf def self.get_project(scope, name, parent_project) prj = nil if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] - #if name =~ /^\[?.+ (\d+)\]?$/ - if name =~ / (\d+)$/ - #prj = scope.find_by(id: $1, parent_id: parent_project&.id) + if name =~ /^\[?.+ (\d+)\]?$/ if parent_project prj = scope.find_by(id: $1, parent_id: parent_project.id) else @@ -198,18 +196,19 @@ module RedmineDmsf end if prj # Check again whether it's really the project and not a folder with a number as a suffix - #prj = nil unless name.include?(DmsfFolder::get_valid_title(prj.name)) - prj = nil unless name.start_with?(DmsfFolder::get_valid_title(prj.name)) + prj = nil unless name.start_with?('[' + DmsfFolder::get_valid_title(prj.name)) end end else - # if name =~ /^\[?([^\]]+)\]?$/ - # prj = scope.find_by(identifier: $1, parent_id: parent_project&.id) - # end - if parent_project - prj = scope.find_by(identifier: name, parent_id: parent_project.id) + if name.start_with?('[') && name.end_with?(']') + identifier = name[1..-2] else - prj = scope.find_by(identifier: name) + identifier = name + end + if parent_project + prj = scope.find_by(identifier: identifier, parent_id: parent_project.id) + else + prj = scope.find_by(identifier: identifier) end end prj diff --git a/lib/redmine_dmsf/webdav/project_resource.rb b/lib/redmine_dmsf/webdav/project_resource.rb index 0e2ab791..80f59024 100644 --- a/lib/redmine_dmsf/webdav/project_resource.rb +++ b/lib/redmine_dmsf/webdav/project_resource.rb @@ -75,8 +75,7 @@ module RedmineDmsf end def long_name - #'[' + project&.name + ']' - project&.name + "[#{project&.name}]" end def content_type @@ -119,11 +118,9 @@ module RedmineDmsf def self.create_project_name(prj) if prj if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] - #"[#{DmsfFolder::get_valid_title(prj.name)} #{prj.id}]" - "#{DmsfFolder::get_valid_title(prj.name)} #{prj.id}" + "[#{DmsfFolder::get_valid_title(prj.name)} #{prj.id}]" else - #"[#{prj.identifier}]" - prj.identifier + "[#{prj.identifier}]" end end end diff --git a/test/integration/webdav/dmsf_webdav_delete_test.rb b/test/integration/webdav/dmsf_webdav_delete_test.rb index cf3b9db6..623271ed 100644 --- a/test/integration/webdav/dmsf_webdav_delete_test.rb +++ b/test/integration/webdav/dmsf_webdav_delete_test.rb @@ -131,7 +131,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", params: nil, headers: @jsmith assert_response :not_found - p1name_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + p1name_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) delete "/dmsf/webdav/#{p1name_uri}/#{@folder6.title}", params: nil, headers: @jsmith assert_response :success @folder6.reload @@ -156,7 +156,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = '1' delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", params: nil, headers: @jsmith assert_response :not_found - p1name_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + p1name_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) delete "/dmsf/webdav/#{p1name_uri}/#{@file1.name}", params: nil, headers: @jsmith assert_response :success @file1.reload diff --git a/test/integration/webdav/dmsf_webdav_get_test.rb b/test/integration/webdav/dmsf_webdav_get_test.rb index 83eec2b0..46cc1dc9 100644 --- a/test/integration/webdav/dmsf_webdav_get_test.rb +++ b/test/integration/webdav/dmsf_webdav_get_test.rb @@ -114,7 +114,7 @@ class DmsfWebdavGetTest < RedmineDmsf::Test::IntegrationTest get "/dmsf/webdav/#{@project1.identifier}/test.txt", params: nil, headers: @admin assert_response :success Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) get "/dmsf/webdav/#{@project1.identifier}/test.txt", params: nil, headers: @admin assert_response :not_found get "/dmsf/webdav/#{project1_uri}/test.txt", params: nil, headers: @admin diff --git a/test/integration/webdav/dmsf_webdav_mkcol_test.rb b/test/integration/webdav/dmsf_webdav_mkcol_test.rb index 221cbc72..2d68f06b 100644 --- a/test/integration/webdav/dmsf_webdav_mkcol_test.rb +++ b/test/integration/webdav/dmsf_webdav_mkcol_test.rb @@ -63,7 +63,7 @@ class DmsfWebdavMkcolTest < RedmineDmsf::Test::IntegrationTest process :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", params: nil, headers: @jsmith assert_response :success Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) process :mkcol, "/dmsf/webdav/#{@project1.identifier}/test2", params: nil, headers: @jsmith assert_response :not_found process :mkcol, "/dmsf/webdav/#{project1_uri}/test3", params: nil, headers: @jsmith diff --git a/test/integration/webdav/dmsf_webdav_move_test.rb b/test/integration/webdav/dmsf_webdav_move_test.rb index b4972e91..4456e494 100644 --- a/test/integration/webdav/dmsf_webdav_move_test.rb +++ b/test/integration/webdav/dmsf_webdav_move_test.rb @@ -108,7 +108,7 @@ class DmsfWebdavMoveTest < RedmineDmsf::Test::IntegrationTest def test_move_to_new_filename_with_project_names Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) new_name = "#{@file1.name}.moved" assert_difference '@file1.dmsf_file_revisions.count', +1 do process :move, "/dmsf/webdav/#{project1_uri}/#{@file1.name}", params: nil, @@ -143,7 +143,7 @@ class DmsfWebdavMoveTest < RedmineDmsf::Test::IntegrationTest def test_move_to_new_folder_with_project_names Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) assert_difference '@file1.dmsf_file_revisions.count', +1 do process :move, "/dmsf/webdav/#{project1_uri}/#{@file1.name}", params: nil, headers: @jsmith.merge!({ diff --git a/test/integration/webdav/dmsf_webdav_options_test.rb b/test/integration/webdav/dmsf_webdav_options_test.rb index 0faac6d2..d54a3f40 100644 --- a/test/integration/webdav/dmsf_webdav_options_test.rb +++ b/test/integration/webdav/dmsf_webdav_options_test.rb @@ -134,7 +134,7 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest process :options, "/dmsf/webdav/#{@project1.identifier}", params: nil, headers: @admin.merge!({ HTTP_USER_AGENT: 'Other' }) assert_response :success - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) process :options, "/dmsf/webdav/#{project1_uri}", params: nil, headers: @admin.merge!({ HTTP_USER_AGENT: 'Other' }) assert_response :success end diff --git a/test/integration/webdav/dmsf_webdav_propfind_test.rb b/test/integration/webdav/dmsf_webdav_propfind_test.rb index 40d9fde0..c87167e4 100644 --- a/test/integration/webdav/dmsf_webdav_propfind_test.rb +++ b/test/integration/webdav/dmsf_webdav_propfind_test.rb @@ -146,7 +146,7 @@ class DmsfWebdavPropfindTest < RedmineDmsf::Test::IntegrationTest def test_propfind_depth1_on_root_for_admin Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true project1_new_name = RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1) - project1_new_uri = Addressable::URI.escape(project1_new_name) + project1_new_uri = ERB::Util.url_encode(project1_new_name) process :propfind, "/dmsf/webdav/#{project1_new_uri}", params: nil, headers: @admin.merge!({ HTTP_DEPTH: '1'}) assert_response :multi_status assert response.body.include?("http://www.example.com:80/dmsf/webdav/#{project1_new_uri}/") diff --git a/test/integration/webdav/dmsf_webdav_put_test.rb b/test/integration/webdav/dmsf_webdav_put_test.rb index 3a7e977e..c06449cc 100644 --- a/test/integration/webdav/dmsf_webdav_put_test.rb +++ b/test/integration/webdav/dmsf_webdav_put_test.rb @@ -75,7 +75,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt' assert file, 'Check for files existance' Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] = true - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", params: '1234', headers: @admin.merge!({ content_type: :text }) assert_response :conflict @@ -115,7 +115,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest headers: @jsmith.merge!({ content_type: :text }) assert_response :conflict - project1_uri = Addressable::URI.escape(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) + project1_uri = ERB::Util.url_encode(RedmineDmsf::Webdav::ProjectResource.create_project_name(@project1)) put "/dmsf/webdav/#{project1_uri}/test-1234.txt", params: '1234', headers: @jsmith.merge!({ content_type: :text }) assert_response :created # Now we have permissions end