Send Contact entity for start/stop sharing
Related to diaspora/diaspora_federation#32
This commit is contained in:
parent
f6dc809e29
commit
e907b3eb18
11 changed files with 80 additions and 117 deletions
|
|
@ -34,6 +34,7 @@ class User
|
|||
if contact.person.local?
|
||||
contact.person.owner.disconnected_by(contact.user.person)
|
||||
else
|
||||
contact.receiving = false
|
||||
Retraction.for(contact).defer_dispatch(self)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -21,10 +21,10 @@ class Retraction
|
|||
when Post
|
||||
Diaspora::Federation::Entities.signed_retraction(target, sender)
|
||||
else
|
||||
Diaspora::Federation::Entities.retraction(target)
|
||||
Diaspora::Federation::Entities.retraction_data_for(target)
|
||||
end
|
||||
|
||||
new(federation_retraction.to_h, target.subscribers.select(&:remote?), target)
|
||||
new(federation_retraction, target.subscribers.select(&:remote?), target)
|
||||
end
|
||||
|
||||
def defer_dispatch(user, include_target_author=true)
|
||||
|
|
|
|||
|
|
@ -5,17 +5,6 @@ module Diaspora
|
|||
public_send(Mappings.builder_for(entity.class), entity)
|
||||
end
|
||||
|
||||
def self.build_retraction(retraction)
|
||||
case retraction.data[:target_type]
|
||||
when "Comment", "Like", "PollParticipation"
|
||||
DiasporaFederation::Entities::RelayableRetraction.new(retraction.data)
|
||||
when "Post"
|
||||
DiasporaFederation::Entities::SignedRetraction.new(retraction.data)
|
||||
else
|
||||
DiasporaFederation::Entities::Retraction.new(retraction.data)
|
||||
end
|
||||
end
|
||||
|
||||
def self.post(post)
|
||||
case post
|
||||
when StatusMessage
|
||||
|
|
@ -50,10 +39,11 @@ module Diaspora
|
|||
end
|
||||
|
||||
def self.contact(contact)
|
||||
# TODO: use DiasporaFederation::Entities::Contact
|
||||
DiasporaFederation::Entities::Request.new(
|
||||
DiasporaFederation::Entities::Contact.new(
|
||||
author: contact.user.diaspora_handle,
|
||||
recipient: contact.person.diaspora_handle
|
||||
recipient: contact.person.diaspora_handle,
|
||||
sharing: contact.receiving,
|
||||
following: contact.receiving
|
||||
)
|
||||
end
|
||||
|
||||
|
|
@ -182,7 +172,7 @@ module Diaspora
|
|||
target_type: Mappings.entity_name_for(target),
|
||||
target: related_entity(target),
|
||||
author: sender.diaspora_handle
|
||||
)
|
||||
).to_h
|
||||
end
|
||||
|
||||
def self.reshare(reshare)
|
||||
|
|
@ -197,24 +187,30 @@ module Diaspora
|
|||
)
|
||||
end
|
||||
|
||||
def self.retraction(target)
|
||||
def self.retraction(retraction)
|
||||
case retraction.data[:target_type]
|
||||
when "Comment", "Like", "PollParticipation"
|
||||
DiasporaFederation::Entities::RelayableRetraction.new(retraction.data)
|
||||
when "Post"
|
||||
DiasporaFederation::Entities::SignedRetraction.new(retraction.data)
|
||||
when "Contact"
|
||||
DiasporaFederation::Entities::Contact.new(retraction.data)
|
||||
else
|
||||
DiasporaFederation::Entities::Retraction.new(retraction.data)
|
||||
end
|
||||
end
|
||||
|
||||
def self.retraction_data_for(target)
|
||||
case target
|
||||
when Contact
|
||||
# TODO: deprecated
|
||||
author = target.user.diaspora_handle
|
||||
DiasporaFederation::Entities::Retraction.new(
|
||||
target_guid: target.user.guid,
|
||||
target_type: "Person",
|
||||
target: DiasporaFederation::Entities::RelatedEntity.new(author: author, local: true),
|
||||
author: author
|
||||
)
|
||||
contact(target).to_h.tap {|data| data[:target_type] = "Contact" }
|
||||
else
|
||||
DiasporaFederation::Entities::Retraction.new(
|
||||
target_guid: target.guid,
|
||||
target_type: Mappings.entity_name_for(target),
|
||||
target: related_entity(target),
|
||||
author: target.diaspora_handle
|
||||
)
|
||||
).to_h
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -225,7 +221,7 @@ module Diaspora
|
|||
target_type: Mappings.entity_name_for(target),
|
||||
target: related_entity(target),
|
||||
author: sender.diaspora_handle
|
||||
)
|
||||
).to_h
|
||||
end
|
||||
|
||||
def self.status_message(status_message)
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ module Diaspora
|
|||
PollParticipation => :poll_participation,
|
||||
Profile => :profile,
|
||||
Reshare => :reshare,
|
||||
Retraction => :build_retraction,
|
||||
Retraction => :retraction,
|
||||
StatusMessage => :status_message
|
||||
}.freeze
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ module Diaspora
|
|||
|
||||
def self.contact(entity)
|
||||
recipient = Person.find_by(diaspora_handle: entity.recipient).owner
|
||||
if entity.sharing.to_s == "true"
|
||||
if entity.sharing
|
||||
Contact.create_or_update_sharing_contact(recipient, author_of(entity))
|
||||
else
|
||||
recipient.disconnected_by(author_of(entity))
|
||||
|
|
|
|||
|
|
@ -49,9 +49,10 @@ describe "attack vectors", type: :request do
|
|||
|
||||
it "should not receive retractions where the retractor and the salmon author do not match" do
|
||||
original_message = eve.post(:status_message, text: "store this!", to: eves_aspect.id)
|
||||
retraction = Retraction.for(original_message)
|
||||
|
||||
expect {
|
||||
post_message(generate_xml(Diaspora::Federation::Entities.retraction(original_message), alice, bob), bob)
|
||||
post_message(generate_xml(Diaspora::Federation::Entities.retraction(retraction), alice, bob), bob)
|
||||
}.to_not change { bob.visible_shareables(Post).count(:all) }
|
||||
end
|
||||
|
||||
|
|
@ -61,7 +62,7 @@ describe "attack vectors", type: :request do
|
|||
contact = bob.contacts(true).find_by(person_id: eve.person.id)
|
||||
expect(contact).to be_sharing
|
||||
|
||||
post_message(generate_xml(Diaspora::Federation::Entities.retraction(contact), alice, bob), bob)
|
||||
post_message(generate_xml(Diaspora::Federation::Entities.retraction(Retraction.for(contact)), alice, bob), bob)
|
||||
|
||||
expect(bob.contacts(true).find_by(person_id: eve.person.id)).to be_sharing
|
||||
end
|
||||
|
|
|
|||
|
|
@ -73,8 +73,8 @@ describe "Receive federation messages feature" do
|
|||
context "with private receive" do
|
||||
let(:recipient) { alice }
|
||||
|
||||
it "treats sharing request recive correctly" do
|
||||
entity = Fabricate(:request_entity, author: sender_id, recipient: alice.diaspora_handle)
|
||||
it "treats sharing request receive correctly" do
|
||||
entity = Fabricate(:contact_entity, author: sender_id, recipient: alice.diaspora_handle)
|
||||
|
||||
expect(Workers::ReceiveLocal).to receive(:perform_async).and_call_original
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ describe Retraction do
|
|||
it "creates a retraction for a contact" do
|
||||
contact = FactoryGirl.create(:contact)
|
||||
|
||||
expect(Diaspora::Federation::Entities).to receive(:retraction).with(contact)
|
||||
expect(Diaspora::Federation::Entities).to receive(:retraction_data_for).with(contact)
|
||||
|
||||
Retraction.for(contact, contact.user)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -36,13 +36,15 @@ describe Diaspora::Federation::Entities do
|
|||
expect(federation_entity.additional_data).to eq(diaspora_entity.signature.additional_data)
|
||||
end
|
||||
|
||||
it "builds a contact (request)" do
|
||||
diaspora_entity = FactoryGirl.build(:contact)
|
||||
it "builds a contact" do
|
||||
diaspora_entity = FactoryGirl.build(:contact, receiving: true)
|
||||
federation_entity = described_class.build(diaspora_entity)
|
||||
|
||||
expect(federation_entity).to be_instance_of(DiasporaFederation::Entities::Request)
|
||||
expect(federation_entity).to be_instance_of(DiasporaFederation::Entities::Contact)
|
||||
expect(federation_entity.author).to eq(diaspora_entity.user.diaspora_handle)
|
||||
expect(federation_entity.recipient).to eq(diaspora_entity.person.diaspora_handle)
|
||||
expect(federation_entity.sharing).to be_truthy
|
||||
expect(federation_entity.following).to be_truthy
|
||||
end
|
||||
|
||||
context "Conversation" do
|
||||
|
|
@ -205,6 +207,31 @@ describe Diaspora::Federation::Entities do
|
|||
expect(federation_entity.provider_display_name).to eq(diaspora_entity.provider_display_name)
|
||||
end
|
||||
|
||||
context "Retraction" do
|
||||
it "builds a Retraction entity for a Photo retraction" do
|
||||
target = FactoryGirl.create(:photo, author: alice.person)
|
||||
retraction = Retraction.for(target)
|
||||
federation_entity = described_class.build(retraction)
|
||||
|
||||
expect(federation_entity).to be_instance_of(DiasporaFederation::Entities::Retraction)
|
||||
expect(federation_entity.author).to eq(target.author.diaspora_handle)
|
||||
expect(federation_entity.target_guid).to eq(target.guid)
|
||||
expect(federation_entity.target_type).to eq("Photo")
|
||||
end
|
||||
|
||||
it "builds a Contact for a Contact retraction" do
|
||||
target = FactoryGirl.create(:contact, receiving: false)
|
||||
retraction = Retraction.for(target)
|
||||
federation_entity = described_class.build(retraction)
|
||||
|
||||
expect(federation_entity).to be_instance_of(DiasporaFederation::Entities::Contact)
|
||||
expect(federation_entity.author).to eq(target.user.diaspora_handle)
|
||||
expect(federation_entity.recipient).to eq(target.person.diaspora_handle)
|
||||
expect(federation_entity.sharing).to be_falsey
|
||||
expect(federation_entity.following).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
context "StatusMessage" do
|
||||
it "builds a status message" do
|
||||
diaspora_entity = FactoryGirl.create(:status_message)
|
||||
|
|
@ -274,88 +301,25 @@ describe Diaspora::Federation::Entities do
|
|||
end
|
||||
end
|
||||
|
||||
describe ".build_retraction" do
|
||||
context "Retraction" do
|
||||
it "builds a Retraction for a Photo" do
|
||||
target = FactoryGirl.create(:photo, author: alice.person)
|
||||
retraction = Retraction.for(target, alice)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
describe ".retraction_data_for" do
|
||||
it "returns the data for a Photo retraction" do
|
||||
target = FactoryGirl.create(:photo, author: alice.person)
|
||||
retraction_data = described_class.retraction_data_for(target)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::Retraction)
|
||||
expect(federation_retraction.author).to eq(target.author.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.guid)
|
||||
expect(federation_retraction.target_type).to eq("Photo")
|
||||
end
|
||||
|
||||
it "builds a Retraction for a Contact" do
|
||||
target = FactoryGirl.create(:contact)
|
||||
retraction = Retraction.for(target, target.user)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::Retraction)
|
||||
expect(federation_retraction.author).to eq(target.user.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.user.guid)
|
||||
expect(federation_retraction.target_type).to eq("Person")
|
||||
end
|
||||
expect(retraction_data[:author]).to eq(target.author.diaspora_handle)
|
||||
expect(retraction_data[:target_guid]).to eq(target.guid)
|
||||
expect(retraction_data[:target_type]).to eq("Photo")
|
||||
end
|
||||
|
||||
context "SignedRetraction" do
|
||||
it "builds a SignedRetraction for a StatusMessage" do
|
||||
target = FactoryGirl.create(:status_message, author: alice.person)
|
||||
retraction = Retraction.for(target, alice)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
it "returns the data for a Contact entity" do
|
||||
target = FactoryGirl.create(:contact, receiving: false)
|
||||
retraction_data = described_class.retraction_data_for(target)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::SignedRetraction)
|
||||
expect(federation_retraction.author).to eq(target.author.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.guid)
|
||||
expect(federation_retraction.target_type).to eq("Post")
|
||||
end
|
||||
|
||||
it "builds a SignedRetraction for a Reshare" do
|
||||
target = FactoryGirl.create(:reshare, author: alice.person)
|
||||
retraction = Retraction.for(target, alice)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::SignedRetraction)
|
||||
expect(federation_retraction.author).to eq(target.author.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.guid)
|
||||
expect(federation_retraction.target_type).to eq("Post")
|
||||
end
|
||||
end
|
||||
|
||||
context "RelayableRetraction" do
|
||||
it "builds a RelayableRetraction for a Comment" do
|
||||
target = FactoryGirl.create(:comment, author: alice.person)
|
||||
retraction = Retraction.for(target, alice)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::RelayableRetraction)
|
||||
expect(federation_retraction.author).to eq(alice.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.guid)
|
||||
expect(federation_retraction.target_type).to eq("Comment")
|
||||
end
|
||||
|
||||
it "builds a RelayableRetraction for a Like" do
|
||||
target = FactoryGirl.create(:like, author: alice.person)
|
||||
retraction = Retraction.for(target, alice)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::RelayableRetraction)
|
||||
expect(federation_retraction.author).to eq(alice.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.guid)
|
||||
expect(federation_retraction.target_type).to eq("Like")
|
||||
end
|
||||
|
||||
it "builds a RelayableRetraction for a PollParticipation" do
|
||||
target = FactoryGirl.create(:poll_participation, author: alice.person)
|
||||
retraction = Retraction.for(target, alice)
|
||||
federation_retraction = described_class.build_retraction(retraction)
|
||||
|
||||
expect(federation_retraction).to be_instance_of(DiasporaFederation::Entities::RelayableRetraction)
|
||||
expect(federation_retraction.author).to eq(alice.diaspora_handle)
|
||||
expect(federation_retraction.target_guid).to eq(target.guid)
|
||||
expect(federation_retraction.target_type).to eq("PollParticipation")
|
||||
end
|
||||
expect(retraction_data[:author]).to eq(target.user.diaspora_handle)
|
||||
expect(retraction_data[:recipient]).to eq(target.person.diaspora_handle)
|
||||
expect(retraction_data[:sharing]).to be_falsey
|
||||
expect(retraction_data[:following]).to be_falsey
|
||||
expect(retraction_data[:target_type]).to eq("Contact")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ describe Diaspora::Federation::Receive do
|
|||
:contact_entity,
|
||||
author: sender.diaspora_handle,
|
||||
recipient: alice.diaspora_handle,
|
||||
sharing: "false"
|
||||
sharing: false
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ describe User::Connecting, type: :model do
|
|||
contact = local_leia.contact_for(remote_raphael)
|
||||
retraction = double
|
||||
|
||||
expect(contact).to receive(:receiving=).with(false)
|
||||
expect(Retraction).to receive(:for).with(contact).and_return(retraction)
|
||||
expect(retraction).to receive(:defer_dispatch).with(local_leia)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue