Skip to content

Commit b693f1c

Browse files
authored
Merge pull request #36 from dentarg/fix-permissions-tracking
Only flip group writable bit if permissions differ
2 parents 9a838da + 00fa7a7 commit b693f1c

File tree

4 files changed

+64
-11
lines changed

4 files changed

+64
-11
lines changed

lib/rubygems/comparator/monitor.rb

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def self.files_permissions_changes(prev_file, curr_file, ignore_group_writable=f
4747
curr_permissions = File.stat(curr_file).mode
4848

4949
diff = prev_permissions ^ curr_permissions
50-
diff ^= 020 if ignore_group_writable
50+
diff ^= 020 if diff != 0 && ignore_group_writable
5151

5252
if diff != 0
5353
" (!) New permissions: " +
@@ -59,13 +59,21 @@ def self.files_permissions_changes(prev_file, curr_file, ignore_group_writable=f
5959

6060
def self.new_file_permissions(file, ignore_group_writable=false)
6161
file_permissions = File.stat(file).mode
62-
formatted_file_permissions = format_permissions(file_permissions)
6362

64-
file_permissions ^= 020 if ignore_group_writable
63+
expected_permissions = if DirUtils.gem_bin_file?(file)
64+
0100755
65+
else
66+
0100644
67+
end
68+
69+
permissions_to_compare = if ignore_group_writable && file_permissions != expected_permissions
70+
file_permissions ^ 020
71+
else
72+
file_permissions
73+
end
6574

66-
unless file_permissions == 0100644 || \
67-
(DirUtils.gem_bin_file?(file) && file_permissions == 0100755)
68-
return " (!) Unexpected permissions: #{formatted_file_permissions}"
75+
unless permissions_to_compare == expected_permissions
76+
return " (!) Unexpected permissions: #{format_permissions(file_permissions)}"
6977
end
7078
''
7179
end

test/rubygems/comparator/test_file_list_comparator.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ def test_files_comparison
99
assert_equal [], @report['files']['0.0.1->0.0.2']['deleted'].messages
1010
assert_equal [], @report['files']['0.0.1->0.0.2']['updated'].messages
1111
assert_equal "bin/lorem +3/-0", @report['files']['0.0.2->0.0.3']['added'].lines(1)
12-
assert_equal "(!) File is not executable", @report['files']['0.0.2->0.0.3']['added'].lines(2).strip
13-
assert_equal "(!) Shebang found: #!/usr/bin/ruby", @report['files']['0.0.2->0.0.3']['added'].lines(3).strip
14-
assert_equal "lib/lorem/utils.rb +7/-0", @report['files']['0.0.2->0.0.3']['added'].lines(4).strip
12+
assert_equal "(!) Unexpected permissions: 100664", @report['files']['0.0.2->0.0.3']['added'].lines(2).strip
13+
assert_equal "(!) File is not executable", @report['files']['0.0.2->0.0.3']['added'].lines(3).strip
14+
assert_equal "(!) Shebang found: #!/usr/bin/ruby", @report['files']['0.0.2->0.0.3']['added'].lines(4).strip
15+
assert_equal "lib/lorem/utils.rb +7/-0", @report['files']['0.0.2->0.0.3']['added'].lines(5).strip
1516
assert_nil @report['files']['0.0.2->0.0.3']['added'].lines(6)
1617
assert_equal [], @report['files']['0.0.2->0.0.3']['deleted'].messages
1718
assert_equal [], @report['files']['0.0.2->0.0.3']['updated'].messages

test/rubygems/comparator/test_monitor.rb

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,21 @@ def test_files_permissions_changes
4949
file1 = File.join(@v003, 'bin/lorem')
5050
file2 = File.join(@v004, 'bin/lorem')
5151
assert_equal '(!) New permissions: 100664 -> 100775', Gem::Comparator::Monitor.files_permissions_changes(file1, file2).strip
52+
assert_equal '(!) New permissions: 100664 -> 100775', Gem::Comparator::Monitor.files_permissions_changes(file1, file2, true).strip
53+
end
54+
55+
def test_files_permissions_changes_no_change
56+
file1 = Tempfile.new
57+
file2 = Tempfile.new
58+
begin
59+
File.chmod(0644, file1)
60+
File.chmod(0644, file2)
61+
assert_equal '', Gem::Comparator::Monitor.files_permissions_changes(file1.path, file2.path)
62+
assert_equal '', Gem::Comparator::Monitor.files_permissions_changes(file1.path, file2.path, true)
63+
ensure
64+
file1.unlink
65+
file2.unlink
66+
end
5267
end
5368

5469
def test_files_permissions_changes_ignores_group_writable_added
@@ -94,16 +109,39 @@ def test_new_file_permissions
94109
file1 = File.join(@v004, 'bin/lorem')
95110
file2 = File.join(@v004, 'lib/lorem.rb')
96111
assert_equal '(!) Unexpected permissions: 100775', Gem::Comparator::Monitor.new_file_permissions(file1).strip
97-
assert_equal '(!) Unexpected permissions: 100664', Gem::Comparator::Monitor.new_file_permissions(file2).strip
112+
assert_equal '(!) Unexpected permissions: 100664', Gem::Comparator::Monitor.new_file_permissions(file2).strip
113+
ignore_group_writable = true
114+
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(file1, ignore_group_writable).strip
115+
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(file2, ignore_group_writable).strip
116+
end
117+
118+
def test_new_file_permissions_ignore_group_writable_when_not_group_writable
119+
file = Tempfile.new
120+
bin_file = temp_bin_file
121+
begin
122+
File.chmod(0644, file)
123+
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(file.path, true)
124+
125+
File.chmod(0755, bin_file)
126+
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(bin_file.path, true)
127+
ensure
128+
file.unlink
129+
bin_file.unlink
130+
end
98131
end
99132

100133
def test_new_file_permissions_ignore_group_writable
101134
file = Tempfile.new
135+
bin_file = temp_bin_file
102136
begin
103137
File.chmod(0664, file)
104-
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(file, true)
138+
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(file.path, true)
139+
140+
File.chmod(0775, bin_file)
141+
assert_equal '', Gem::Comparator::Monitor.new_file_permissions(bin_file.path, true)
105142
ensure
106143
file.unlink
144+
bin_file.unlink
107145
end
108146
end
109147

test/test_helper.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ def setup_file_permissions
1111
File.chmod(0775, File.join(gemfiles_path, 'lorem-0.0.4', 'bin', 'lorem'))
1212
end
1313

14+
def temp_bin_file
15+
bin_dir = File.join(Dir.mktmpdir, "bin")
16+
Dir.mkdir(bin_dir)
17+
Tempfile.new("", bin_dir)
18+
end
19+
1420
class TestGemComparator < Minitest::Test
1521
def setup
1622
super

0 commit comments

Comments
 (0)