diff --git a/lib/diaspora_federation/entities/relayable.rb b/lib/diaspora_federation/entities/relayable.rb index 8f2d68d..4967380 100644 --- a/lib/diaspora_federation/entities/relayable.rb +++ b/lib/diaspora_federation/entities/relayable.rb @@ -89,6 +89,10 @@ module DiasporaFederation verify_parent_author_signature unless parent.local end + def sender_valid?(sender) + sender == author || sender == parent.author + end + private # this happens only on downstream federation diff --git a/lib/diaspora_federation/entities/retraction.rb b/lib/diaspora_federation/entities/retraction.rb index 0545ab1..b49aaa0 100644 --- a/lib/diaspora_federation/entities/retraction.rb +++ b/lib/diaspora_federation/entities/retraction.rb @@ -33,6 +33,15 @@ module DiasporaFederation super(data) end + def sender_valid?(sender) + case target_type + when "Comment", "Like", "PollParticipation" + sender == target.author || sender == target.parent.author + else + sender == target.author + end + end + # @param [Nokogiri::XML::Element] root_node xml nodes # @return [Retraction] instance def self.populate_entity(root_node) diff --git a/lib/diaspora_federation/federation/receiver/abstract_receiver.rb b/lib/diaspora_federation/federation/receiver/abstract_receiver.rb index b62317d..40c97f8 100644 --- a/lib/diaspora_federation/federation/receiver/abstract_receiver.rb +++ b/lib/diaspora_federation/federation/receiver/abstract_receiver.rb @@ -27,16 +27,8 @@ module DiasporaFederation end def sender_valid? - case entity - when Entities::Retraction - case entity.target_type - when "Comment", "Like", "PollParticipation" - sender == entity.target.author || sender == entity.target.parent.author - else - sender == entity.target.author - end - when Entities::Relayable - sender == entity.author || sender == entity.parent.author + if entity.respond_to?(:sender_valid?) + entity.sender_valid?(sender) else sender == entity.author end diff --git a/spec/lib/diaspora_federation/entities/relayable_spec.rb b/spec/lib/diaspora_federation/entities/relayable_spec.rb index 339ee33..730982c 100644 --- a/spec/lib/diaspora_federation/entities/relayable_spec.rb +++ b/spec/lib/diaspora_federation/entities/relayable_spec.rb @@ -323,5 +323,26 @@ XML expect(entity.parent).to eq(remote_parent) end end + + describe "#sender_valid?" do + it "allows author" do + entity = SomeRelayable.new(hash) + + expect(entity.sender_valid?(author)).to be_truthy + end + + it "allows parent author" do + entity = SomeRelayable.new(hash) + + expect(entity.sender_valid?(local_parent.author)).to be_truthy + end + + it "does not allow any random author" do + entity = SomeRelayable.new(hash) + invalid_author = FactoryGirl.generate(:diaspora_id) + + expect(entity.sender_valid?(invalid_author)).to be_falsey + end + end end end diff --git a/spec/lib/diaspora_federation/entities/retraction_spec.rb b/spec/lib/diaspora_federation/entities/retraction_spec.rb index 9f73b27..d1ceaa4 100644 --- a/spec/lib/diaspora_federation/entities/retraction_spec.rb +++ b/spec/lib/diaspora_federation/entities/retraction_spec.rb @@ -26,5 +26,54 @@ XML it_behaves_like "an XML Entity" it_behaves_like "a retraction" + + describe "#sender_valid?" do + context "unrelayable target" do + it "allows target author" do + entity = Entities::Retraction.new(data) + + expect(entity.sender_valid?(bob.diaspora_id)).to be_truthy + end + + it "does not allow any random author" do + entity = Entities::Retraction.new(data) + invalid_author = FactoryGirl.generate(:diaspora_id) + + expect(entity.sender_valid?(invalid_author)).to be_falsey + end + end + + %w(Comment Like PollParticipation).each do |target_type| + context "#{target_type} target" do + let(:relayable_target) { + FactoryGirl.build( + :related_entity, + author: bob.diaspora_id, + parent: FactoryGirl.build(:related_entity, author: alice.diaspora_id) + ) + } + let(:relayable_data) { data.merge(target_type: target_type, target: relayable_target) } + + it "allows target author" do + entity = Entities::Retraction.new(relayable_data) + + expect(entity.sender_valid?(bob.diaspora_id)).to be_truthy + end + + it "allows target parent author" do + entity = Entities::Retraction.new(relayable_data) + + expect(entity.sender_valid?(alice.diaspora_id)).to be_truthy + end + + it "does not allow any random author" do + entity = Entities::Retraction.new(relayable_data) + invalid_author = FactoryGirl.generate(:diaspora_id) + + expect(entity.sender_valid?(invalid_author)).to be_falsey + end + end + end + end end end