diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 74a11a1c7..13871c323 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -84,7 +84,7 @@ class AttachmentsController < ApplicationController @attachment = Attachment.new(:file => request.raw_post) @attachment.author = User.current - @attachment.filename = Redmine::Utils.random_hex(16) + @attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16) if @attachment.save respond_to do |format| diff --git a/test/integration/api_test/attachments_test.rb b/test/integration/api_test/attachments_test.rb index 4814c047a..11e444195 100644 --- a/test/integration/api_test/attachments_test.rb +++ b/test/integration/api_test/attachments_test.rb @@ -117,6 +117,18 @@ class ApiTest::AttachmentsTest < ActionController::IntegrationTest assert_equal token, attachment.token end + test "POST /uploads.xml should accept :filename param as the attachment filename" do + set_tmp_attachments_directory + assert_difference 'Attachment.count' do + post '/uploads.xml?filename=test.txt', 'File content', {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) + assert_response :created + end + + attachment = Attachment.order('id DESC').first + assert_equal 'test.txt', attachment.filename + assert_match /_test\.txt$/, attachment.diskfile + end + test "POST /uploads.xml should not accept other content types" do set_tmp_attachments_directory assert_no_difference 'Attachment.count' do