]> source.dussan.org Git - redmine.git/commitdiff
fix file name corruption when export a wiki page with non-ASCII title in MS browsers...
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 30 Aug 2017 15:46:45 +0000 (15:46 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 30 Aug 2017 15:46:45 +0000 (15:46 +0000)
Contributed by Go MAEDA.

git-svn-id: http://svn.redmine.org/redmine/trunk@16957 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/wiki_controller.rb
test/functional/wiki_controller_test.rb

index 25e59adb0c921390ff96db6dfd5d3a7ab9387d38..b43b933cdd101dece26ef410dcaebe99d207039b 100644 (file)
@@ -100,14 +100,14 @@ class WikiController < ApplicationController
 
     if User.current.allowed_to?(:export_wiki_pages, @project)
       if params[:format] == 'pdf'
-        send_file_headers! :type => 'application/pdf', :filename => "#{@page.title}.pdf"
+        send_file_headers! :type => 'application/pdf', :filename => filename_for_content_disposition("#{@page.title}.pdf")
         return
       elsif params[:format] == 'html'
         export = render_to_string :action => 'export', :layout => false
-        send_data(export, :type => 'text/html', :filename => "#{@page.title}.html")
+        send_data(export, :type => 'text/html', :filename => filename_for_content_disposition("#{@page.title}.html"))
         return
       elsif params[:format] == 'txt'
-        send_data(@content.text, :type => 'text/plain', :filename => "#{@page.title}.txt")
+        send_data(@content.text, :type => 'text/plain', :filename => filename_for_content_disposition("#{@page.title}.txt"))
         return
       end
     end
index 314d463852f10fe37cc09863d71151b109db07b6..193efb0b7f23232c1b7fa055796ee0dd70b542aa 100644 (file)
@@ -1,3 +1,5 @@
+# encoding: utf-8
+#
 # Redmine - project management software
 # Copyright (C) 2006-2017  Jean-Philippe Lang
 #
@@ -1087,6 +1089,26 @@ class WikiControllerTest < Redmine::ControllerTest
     assert_include 'h1. CookBook documentation v2', @response.body
   end
 
+  def test_show_filename_should_be_uri_encoded_for_ms_browsers
+    @request.session[:user_id] = 2
+    title = 'Этика_менеджмента'
+    %w|pdf html txt|.each do |format|
+      # Non-MS browsers
+      @request.user_agent = ""
+      get :show, :params => {:project_id => 1, :id => title, :format => format}
+      assert_response :success
+      assert_equal "attachment; filename=\"#{title}.#{format}\"",
+                    @response.headers['Content-Disposition']
+      # Microsoft's browsers: filename should be URI encoded
+      @request.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'
+      get :show, :params => {:project_id => 1, :id => title, :format => format}
+      assert_response :success
+      filename = URI.encode("#{title}.#{format}")
+      assert_equal "attachment; filename=\"#{filename}\"",
+                    @response.headers['Content-Disposition']
+    end
+  end
+
   def test_edit_unprotected_page
     # Non members can edit unprotected wiki pages
     @request.session[:user_id] = 4