From a3f1db6a6890dee1369609492f20f6d994cf8e0e Mon Sep 17 00:00:00 2001 From: kumojima Date: Tue, 16 Jun 2026 21:30:07 +0900 Subject: fix shorten filename with long extension --- app/models/attachment.rb | 7 +++++-- test/unit/attachment_test.rb | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 6932d79a2..2adfc9f9f 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -596,12 +596,15 @@ class Attachment < ApplicationRecord def create_diskfile(filename, directory=nil, &) timestamp = DateTime.now.strftime("%y%m%d%H%M%S") ascii = '' - if %r{^[a-zA-Z0-9_.-]*$}.match?(filename) && filename.length <= 50 + max_filename_length = 50 + if %r{^[a-zA-Z0-9_.-]*$}.match?(filename) && filename.length <= max_filename_length ascii = filename else ascii = ActiveSupport::Digest.hexdigest(filename) # keep the extension if any - ascii << $1 if filename =~ %r{(\.[a-zA-Z0-9]+)$} + if filename =~ %r{(\.[a-zA-Z0-9]+)$} && "#{ascii}#{$1}".length <= max_filename_length + ascii << $1 + end end path = File.join storage_path, directory.to_s diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb index 387da73c5..2107e389f 100644 --- a/test/unit/attachment_test.rb +++ b/test/unit/attachment_test.rb @@ -81,6 +81,19 @@ class AttachmentTest < ActiveSupport::TestCase assert_equal 255, a.filename.length end + def test_shorted_filename_if_too_long_extension + file = mock_file_with_options(:original_filename => "file.#{'a'*250}") + + a = Attachment.new(:container => Issue.find(1), + :file => file, + :author => User.find(1)) + assert a.save + a.reload + # timestamp_hexdigest + assert_equal 12 + 1 + 32, a.disk_filename.length + assert_equal 255, a.filename.length + end + def test_copy_should_preserve_attributes # prevent re-use of data from other attachments with equal contents Attachment.where('id <> 1').destroy_all -- 2.43.0