Skip to content

Commit 1750fec

Browse files
authored
Merge pull request #3329 from sap-contributions/validate-resource-match-object-mode
Add validation for resource match mode
2 parents 290c87e + 22e2122 commit 1750fec

2 files changed

Lines changed: 68 additions & 12 deletions

File tree

app/messages/resource_match_create_message.rb

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,54 +22,72 @@ def v2_fingerprints_body
2222

2323
private
2424

25+
PERMISSIONS_REGEX = /^[0-7]{3,4}$/
26+
2527
def each_resource
2628
if resources.is_a?(Array)
2729
resources.each do |r|
2830
checksum_validator(r[:checksum])
2931
size_validator(r[:size_in_bytes])
32+
mode_validator(r[:mode])
3033
end
3134
end
3235
end
3336

34-
RESOURCE_ERROR_PREAMBLE = 'array contains at least one resource with a'.freeze
37+
RESOURCE_ERROR_PREAMBLE = 'array contains at least one resource with'.freeze
3538

3639
def checksum_validator(checksum)
3740
unless checksum.is_a?(Hash)
38-
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} non-object checksum") unless errors.added?(
39-
:resources, "#{RESOURCE_ERROR_PREAMBLE} non-object checksum"
41+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-object checksum") unless errors.added?(
42+
:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-object checksum"
4043
)
4144
return
4245
end
4346

4447
unless checksum[:value].is_a?(String)
45-
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} non-string checksum value") unless errors.added?(
46-
:resources, "#{RESOURCE_ERROR_PREAMBLE} non-string checksum value"
48+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-string checksum value") unless errors.added?(
49+
:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-string checksum value"
4750
)
4851
return
4952
end
5053

5154
unless valid_sha1?(checksum[:value])
52-
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} non-SHA1 checksum value") unless errors.added?(
53-
:resources, "#{RESOURCE_ERROR_PREAMBLE} non-SHA1 checksum value"
55+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-SHA1 checksum value") unless errors.added?(
56+
:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-SHA1 checksum value"
5457
)
55-
return
5658
end
5759
end
5860

5961
def size_validator(size)
6062
unless size.is_a?(Integer)
61-
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} non-integer size_in_bytes") unless errors.added?(
62-
:resources, "#{RESOURCE_ERROR_PREAMBLE} non-integer size_in_bytes"
63+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-integer size_in_bytes") unless errors.added?(
64+
:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-integer size_in_bytes"
6365
)
6466
return
6567
end
6668

6769
unless size >= 0
68-
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} negative size_in_bytes") unless errors.added?(
69-
:resources, "#{RESOURCE_ERROR_PREAMBLE} negative size_in_bytes"
70+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} a negative size_in_bytes") unless errors.added?(
71+
:resources, "#{RESOURCE_ERROR_PREAMBLE} a negative size_in_bytes"
72+
)
73+
end
74+
end
75+
76+
def mode_validator(mode)
77+
return if mode.nil?
78+
79+
unless mode.is_a?(String)
80+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-string mode") unless errors.added?(
81+
:resources, "#{RESOURCE_ERROR_PREAMBLE} a non-string mode"
7082
)
7183
return
7284
end
85+
86+
unless PERMISSIONS_REGEX.match?(mode)
87+
errors.add(:resources, "#{RESOURCE_ERROR_PREAMBLE} an incorrect mode") unless errors.added?(
88+
:resources, "#{RESOURCE_ERROR_PREAMBLE} an incorrect mode"
89+
)
90+
end
7391
end
7492

7593
def valid_sha1?(value)

spec/unit/messages/resource_match_create_message_spec.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,44 @@
166166
end
167167
end
168168

169+
context 'when the v3 mode is not a string' do
170+
let(:params) do
171+
{
172+
resources: [
173+
{
174+
checksum: { value: '002d760bea1be268e27077412e11a320d0f164d3' },
175+
size_in_bytes: 36,
176+
mode: 123
177+
}
178+
]
179+
}
180+
end
181+
182+
it 'has the correct error message' do
183+
expect(subject).to be_invalid
184+
expect(subject.errors[:resources]).to include('array contains at least one resource with a non-string mode')
185+
end
186+
end
187+
188+
context 'when the v3 mode is not a POSIX file permissions string' do
189+
let(:params) do
190+
{
191+
resources: [
192+
{
193+
checksum: { value: '002d760bea1be268e27077412e11a320d0f164d3' },
194+
size_in_bytes: 36,
195+
mode: '9876'
196+
}
197+
]
198+
}
199+
end
200+
201+
it 'has the correct error message' do
202+
expect(subject).to be_invalid
203+
expect(subject.errors[:resources]).to include('array contains at least one resource with an incorrect mode')
204+
end
205+
end
206+
169207
context 'when there are multiple validation violations' do
170208
let(:params) do
171209
{

0 commit comments

Comments
 (0)