Project

General

Profile

Defect #40020 » 0001-Fix-ScmData.binary-method-not-to-consider-UTF-8-text.patch

Go MAEDA, 2024-01-08 15:57

View differences:

lib/redmine/scm/adapters/abstract_adapter.rb
441 441
      module ScmData
442 442
        def self.binary?(data)
443 443
          unless data.empty?
444
            data.count("^ -~", "^\r\n").fdiv(data.size) > 0.3 || data.index("\x00")
444
            data.index("\x00") || data.count("\x00-\x1f\x7f", "^\t\r\n").fdiv(data.size) > 0.3
445 445
          end
446 446
        end
447 447
      end
test/unit/lib/redmine/scm/adapters/scm_data_test.rb
1
# frozen_string_literal: true
2

  
3
# Redmine - project management software
4
# Copyright (C) 2006-2023  Jean-Philippe Lang
5
#
6
# This program is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU General Public License
8
# as published by the Free Software Foundation; either version 2
9
# of the License, or (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19

  
20
require_relative '../../../../../test_helper'
21
require 'redmine/scm/adapters/abstract_adapter'
22

  
23
class ScmDataTest < ActiveSupport::TestCase
24
  include Redmine::Scm::Adapters
25

  
26
  def test_binary_with_binary_data
27
    data = +"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10"
28
    data.force_encoding('ASCII-8BIT')
29
    assert ScmData.binary?(data)
30
  end
31

  
32
  def test_binary_with_text_data
33
    data = "Flexible\nProject\tManagement\nSoftware\r\n"
34
    assert_not ScmData.binary?(data)
35
  end
36

  
37
  def test_binary_with_utf8_text_should_not_be_binary
38
    # full-width Latin letters ("\uFF32\uFF45\uFF44\uFF4D\uFF49\uFF4E\uFF45")
39
    data = "Redmine"
40
    assert_not ScmData.binary?(data)
41
  end
42

  
43
  def test_binary_with_ascii_text_containing_0x00_should_be_binary
44
    data = +"null\0"
45
    assert ScmData.binary?(data)
46
  end
47
end
(1-1/2)