]> source.dussan.org Git - redmine.git/commitdiff
do not annotate text files which exceed the size limit for viewing (#9484)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Sat, 5 Nov 2011 03:47:03 +0000 (03:47 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Sat, 5 Nov 2011 03:47:03 +0000 (03:47 +0000)
Contributed by Antonio García-Domínguez.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@7728 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/repositories_controller.rb
config/locales/en-GB.yml
config/locales/en.yml
config/locales/es.yml
test/functional/repositories_git_controller_test.rb

index a04498af077795f2c4d92ccdb80d3b5501565153..7f346bfd6ba7e9333f14d83f036ec0799f9feaee 100644 (file)
@@ -172,7 +172,16 @@ class RepositoriesController < ApplicationController
     (show_error_not_found; return) unless @entry
 
     @annotate = @repository.scm.annotate(@path, @rev)
-    (render_error l(:error_scm_annotate); return) if @annotate.nil? || @annotate.empty?
+    if @annotate.nil? || @annotate.empty?
+      (render_error l(:error_scm_annotate); return)
+    end
+    ann_buf_size = 0
+    @annotate.lines.each do |buf|
+      ann_buf_size += buf.size
+    end
+    if ann_buf_size > Setting.file_max_size_displayed.to_i.kilobyte
+      (render_error l(:error_scm_annotate_big_text_file); return)
+    end
     @changeset = @repository.find_changeset_by_name(@rev)
   end
 
index f5a6dccfab8346e1defe9d9ce4646bf1c291a361..19ea883a0faa45980444c06240fa0fc12a61a42f 100644 (file)
@@ -180,6 +180,7 @@ en-GB:
   error_scm_not_found: "The entry or revision was not found in the repository."
   error_scm_command_failed: "An error occurred when trying to access the repository: %{value}"
   error_scm_annotate: "The entry does not exist or cannot be annotated."
+  error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size."
   error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
   error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.'
   error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
index ee87170570eaf5b73c98cbe21a7fe6468236b13b..ee449255081c38f6cfea5c8a4970fa8a168d3f6c 100644 (file)
@@ -176,6 +176,7 @@ en:
   error_scm_not_found: "The entry or revision was not found in the repository."
   error_scm_command_failed: "An error occurred when trying to access the repository: %{value}"
   error_scm_annotate: "The entry does not exist or cannot be annotated."
+  error_scm_annotate_big_text_file: "The entry cannot be annotated, as it exceeds the maximum text file size."
   error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
   error_no_tracker_in_project: 'No tracker is associated to this project. Please check the Project settings.'
   error_no_default_issue_status: 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
index c45675a7dbfde4cabb4b8dd6a7aa2bf59d15dd01..13a74236738cd6ecc84dbec95a1a91ea943dee5d 100644 (file)
@@ -245,6 +245,7 @@ es:
   error_can_t_load_default_data: "No se ha podido cargar la configuración por defecto: %{value}"
   error_issue_not_found_in_project: 'La petición no se encuentra o no está asociada a este proyecto'
   error_scm_annotate: "No existe la entrada o no ha podido ser anotada"
+  error_scm_annotate_big_text_file: "La entrada no puede anotarse, al superar el tamaño máximo para ficheros de texto."
   error_scm_command_failed: "Se produjo un error al acceder al repositorio: %{value}"
   error_scm_not_found: "La entrada y/o la revisión no existe en el repositorio."
   field_account: Cuenta
index 5eea1d4f725bc1b63883156c33b303e17b5adff7..0a95cbeef341e1d6a358a1d4af7405a3d92944f0 100644 (file)
@@ -354,6 +354,19 @@ class RepositoriesGitControllerTest < ActionController::TestCase
                               :content => /cannot be annotated/
     end
 
+    def test_annotate_error_when_too_big
+      with_settings :file_max_size_displayed => 1 do
+        get :annotate, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb'], :rev => 'deff712f'
+        assert_response 500
+        assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
+                                :content => /exceeds the maximum text file size/
+
+        get :annotate, :id => PRJ_ID, :path => ['README'], :rev => '7234cb2'
+        assert_response :success
+        assert_template 'annotate'
+      end
+    end
+
     def test_annotate_latin_1
       if @ruby19_non_utf8_pass
         puts_ruby19_non_utf8_pass()