diff --git a/lib/diaspora/federation/receive.rb b/lib/diaspora/federation/receive.rb index 87887c54e..9de2c79e5 100644 --- a/lib/diaspora/federation/receive.rb +++ b/lib/diaspora/federation/receive.rb @@ -21,7 +21,12 @@ module Diaspora def self.contact(entity) recipient = Person.find_by(diaspora_handle: entity.recipient).owner - Contact.create_or_update_sharing_contact(recipient, author_of(entity)) + if entity.sharing.to_s == "true" + Contact.create_or_update_sharing_contact(recipient, author_of(entity)) + else + recipient.disconnected_by(author_of(entity)) + nil + end end def self.conversation(entity) diff --git a/spec/lib/diaspora/federation/receive_spec.rb b/spec/lib/diaspora/federation/receive_spec.rb index 5dd8b1856..3d2b7022a 100644 --- a/spec/lib/diaspora/federation/receive_spec.rb +++ b/spec/lib/diaspora/federation/receive_spec.rb @@ -77,6 +77,35 @@ describe Diaspora::Federation::Receive do expect(Diaspora::Federation::Receive.contact(contact_entity)).to be_nil end + + context "sharing=false" do + let(:unshare_contact_entity) { + FactoryGirl.build( + :contact_entity, + author: sender.diaspora_handle, + recipient: alice.diaspora_handle, + sharing: "false" + ) + } + + it "disconnects, if currently connected" do + alice.contacts.find_or_initialize_by(person_id: sender.id, receiving: true, sharing: true).save! + + received = Diaspora::Federation::Receive.contact(unshare_contact_entity) + expect(received).to be_nil + + contact = alice.contacts.find_by!(person_id: sender.id) + + expect(contact).not_to be_nil + expect(contact.sharing).to be_falsey + end + + it "does nothing, if already disconnected" do + received = Diaspora::Federation::Receive.contact(unshare_contact_entity) + expect(received).to be_nil + expect(alice.contacts.find_by(person_id: sender.id)).to be_nil + end + end end describe ".conversation" do