]> source.dussan.org Git - redmine.git/commitdiff
Merged r16957 from trunk to 3.3-stable (#26599)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 30 Aug 2017 16:39:41 +0000 (16:39 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 30 Aug 2017 16:39:41 +0000 (16:39 +0000)
fix file name corruption when export a wiki page with non-ASCII title in MS browsers.

Contributed by Go MAEDA.

git-svn-id: http://svn.redmine.org/redmine/branches/3.3-stable@16960 e93f8b46-1217-0410-a6f0-8f06a7374b81

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

index 36a9b87418dc8a49314a5a6f22a0772a8d2d9c62..ebf7a1884954f197c4bdb17817ecdd6819b39eb4 100644 (file)
@@ -97,14 +97,14 @@ class WikiController < ApplicationController
     end
     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 14f9c2760688afb42cc029a2f3e7fe49e9fb6ebe..73d953c82a8843fcbb64291faea7836f58ac11ef 100644 (file)
@@ -1,3 +1,5 @@
+# encoding: utf-8
+#
 # Redmine - project management software
 # Copyright (C) 2006-2016  Jean-Philippe Lang
 #
@@ -989,6 +991,26 @@ class WikiControllerTest < ActionController::TestCase
     assert_include 'h1. CookBook documentation', @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, :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, :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