A problem by attaching documents to issues #866

This commit is contained in:
Karel Pičman 2018-06-01 09:23:58 +02:00
parent 44981a54d8
commit 0f9cf15262
8 changed files with 31 additions and 22 deletions

View File

@ -52,7 +52,7 @@ class DmsfFile < ActiveRecord::Base
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
validates :name, :presence => true
validates_format_of :name, :with => DmsfFolder::INVALID_CHARACTERS,
validates_format_of :name, :with => /\A[^#{DmsfFolder::INVALID_CHARACTERS}]*\z/,
:message => l(:error_contains_invalid_character)
validate :validates_name_uniqueness

View File

@ -66,7 +66,7 @@ class DmsfFileRevision < ActiveRecord::Base
joins("JOIN #{Project.table_name} ON #{Project.table_name}.id = #{DmsfFile.table_name}.project_id").visible
validates :title, :presence => true
validates_format_of :name, :with => DmsfFolder::INVALID_CHARACTERS,
validates_format_of :name, :with => /\A[^#{DmsfFolder::INVALID_CHARACTERS}]*\z/,
:message => l(:error_contains_invalid_character)
validates :description, length: { maximum: 1.kilobyte }

View File

@ -43,7 +43,7 @@ class DmsfFolder < ActiveRecord::Base
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
has_many :dmsf_folder_permissions, :dependent => :destroy
INVALID_CHARACTERS = /\A[^\[\]\/\\\?":<>#%\*]*\z/.freeze
INVALID_CHARACTERS = '\[\]\/\\\?":<>#%\*'.freeze
STATUS_DELETED = 1.freeze
STATUS_ACTIVE = 0.freeze
AVAILABLE_COLUMNS = %w(id title extension size modified version workflow author).freeze
@ -97,7 +97,7 @@ class DmsfFolder < ActiveRecord::Base
validates :title, :presence => true
validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted],
conditions: -> { where(:deleted => STATUS_ACTIVE) }
validates_format_of :title, :with => INVALID_CHARACTERS,
validates_format_of :title, :with => /\A[^#{INVALID_CHARACTERS}]*\z/,
:message => l(:error_contains_invalid_character)
validate :check_cycle
validates_length_of :description, :maximum => 65535
@ -551,6 +551,13 @@ class DmsfFolder < ActiveRecord::Base
self.save
end
def self.get_valid_title(title)
# 1. Invalid characters are replaced with dots.
# 2. Two or more dots in a row are replaced with a single dot.
# 3. Windows' WebClient does not like a dot at the end.
title.gsub(/[#{INVALID_CHARACTERS}]/, '.').gsub(/\.{2,}/, '.').chomp('.')
end
private
def self.directory_subtree(tree, folder, level, current_folder)

View File

@ -86,7 +86,7 @@
:position => position}) %>
</tr>
<% elsif obj.is_a?(DmsfLink) && (obj.target_type == 'DmsfFile') %>
<% unless obj.target_file.last_revision %>
<% unless obj.target_file && obj.target_file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{obj.target_id} has no revision!" %>
<% next %>
<% end %>

View File

@ -79,7 +79,7 @@ module RedmineDmsf
system_folder = issue.system_folder(false, old_project_id)
if system_folder
# Change the title if the issue's subject changed
system_folder.title = "#{issue.id} - #{issue.subject}"
system_folder.title = "#{issue.id} - #{DmsfFolder::get_valid_title(issue.subject)}"
# Move system folders if needed
if system_folder.dmsf_folder
system_folder.dmsf_folder.project_id = project_id

View File

@ -112,7 +112,7 @@ module RedmineDmsf
folder = DmsfFolder.new
folder.dmsf_folder_id = parent.id
folder.project_id = prj_id
folder.title = "#{self.id} - #{self.subject}"
folder.title = "#{self.id} - #{DmsfFolder::get_valid_title(self.subject)}"
folder.user_id = User.anonymous.id
folder.system = true
folder.save

View File

@ -112,23 +112,19 @@ module RedmineDmsf
end
def project_id
self.project.id if self.project
project.id if project
end
# Characters that MATCH this regex will be replaced with dots, no more than one dot in a row.
INVALID_CHARACTERS = /[\/\\\?":<>#%\*\[\]]/.freeze # = / \ ? " : < > # % * [ ]
def self.create_project_name(p)
use_project_names = Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names']
if use_project_names
# 1. Invalid characters are replaced with dots.
# 2. Two or more dots in a row are replaced with a single dot.
# (3. Windows WebClient does not like a dot at the end, but since the project id tag is appended this is not a problem.)
"#{p.name.gsub(INVALID_CHARACTERS, '.').gsub(/\.{2,}/, '.')} #{p.id}" if p
def self.create_project_name(project)
if project
if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names']
"#{DmsfFolder::get_valid_title(project.name)} #{project.id}"
else
p.identifier if p
project.identifier
end
end
end
end
end
end

View File

@ -167,4 +167,10 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
assert !tree.to_s.include?('...folder2'), "'...folder2' string in the folder tree not expected."
end
def test_get_valid_title
assert_equal '1052-6024 . U_CPLD_5M240Z_SMT_MBGA100_1.8V_-40',
DmsfFolder::get_valid_title('1052-6024 : U_CPLD_5M240Z_SMT_MBGA100_1.8V_-40...')
assert_equal 'test', DmsfFolder::get_valid_title("test#{DmsfFolder::INVALID_CHARACTERS}")
end
end