Skip to content

Commit b917cd5

Browse files
authored
fix(datacollector): ensure recipient is a user (#2733)
prevent error a when a mail is send by a registered device but only to the ELN address. ``` NoMethodError: undefined method `container' for #<Device:0x000056fdf85476d8> from activemodel (6.1.7.9) lib/active_model/attribute_methods.rb:469:in `method_missing' from lib/datacollector/correspondence.rb:72:in `prepare_containers' ```
1 parent f5be65a commit b917cd5

File tree

4 files changed

+18
-1
lines changed

4 files changed

+18
-1
lines changed

lib/datacollector/correspondence.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def initialize(from, to) # rubocop:disable Metrics/PerceivedComplexity, Metrics/
3636

3737
raise Errors::DatacollectorError, "Sender not found #{from}" unless validate(@sender)
3838
raise Errors::DatacollectorError, "Recipient not found #{to}" unless validate(@recipient)
39+
raise Errors::DatacollectorError, 'Recipient can only be a User' unless valid_recipient?(@recipient)
3940
raise Errors::DatacollectorError, 'User can only send to self' if @sender.is_a?(User) && @recipient != @sender
4041

4142
prepare_containers

lib/datacollector/correspondence_array.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ def initialize(from, to_list) # rubocop:disable Metrics/CyclomaticComplexity, Me
1818
errors = []
1919
raise Errors::DatacollectorError, "Sender not found #{from}" unless Correspondence.validate(@sender)
2020

21-
correspondences = (to_list.presence || [@sender]).filter_map do |receiver|
21+
recipients = to_list.presence
22+
recipients ||= Correspondence.valid_recipient?(@sender) ? [@sender] : []
23+
correspondences = recipients.filter_map do |receiver|
2224
Correspondence.new(@sender, receiver)
2325
rescue Errors::DatacollectorError => e
2426
errors << e.message

lib/datacollector/correspondence_helpers.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ def validate(obj)
3636
end
3737
end
3838

39+
def valid_recipient?(obj)
40+
obj.is_a?(User)
41+
end
42+
3943
# Find a device by email or name abbreviation
4044
# @param [String] The email or name abbreviation
4145
def find_device(raw_identifier)

spec/lib/datacollector/correspondence_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
let(:person) { create(:person) }
1717
let(:device) { create(:device, :file_local, user_identifiers: [person.name_abbreviation]) }
1818

19+
# rubocop:disable RSpec/NestedGroups
1920
describe described_class do
2021
subject(:correspondence) { described_class.new(device, person) }
2122

@@ -35,7 +36,16 @@
3536
expect(container).to be_a(Container)
3637
expect(person.container.descendants).to include(container)
3738
end
39+
40+
context 'when the arguments are not valid' do
41+
subject(:correspondence) { described_class.new(device, device) }
42+
43+
it 'raises a Errors::DatacollectorError' do
44+
expect { correspondence }.to raise_error(Errors::DatacollectorError)
45+
end
46+
end
3847
end
48+
# rubocop:enable RSpec/NestedGroups
3949

4050
describe '#sender_container' do
4151
it 'has the proper name and container_type' do

0 commit comments

Comments
 (0)