Resend AccountMigration or AccountDeletion for closed recipients
This commit is contained in:
parent
88e2e593a4
commit
3cb1e470a4
9 changed files with 76 additions and 17 deletions
|
|
@ -128,7 +128,7 @@ class AccountMigration < ApplicationRecord
|
||||||
|
|
||||||
def person_references
|
def person_references
|
||||||
references = Person.reflections.reject {|key, _|
|
references = Person.reflections.reject {|key, _|
|
||||||
%w[profile owner notifications pod account_migration].include?(key)
|
%w[profile owner notifications pod account_deletion account_migration].include?(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
references.map {|key, value|
|
references.map {|key, value|
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ class Person < ApplicationRecord
|
||||||
|
|
||||||
has_many :mentions, :dependent => :destroy
|
has_many :mentions, :dependent => :destroy
|
||||||
|
|
||||||
|
has_one :account_deletion, dependent: :destroy
|
||||||
has_one :account_migration, foreign_key: :old_person_id, dependent: :nullify, inverse_of: :old_person
|
has_one :account_migration, foreign_key: :old_person_id, dependent: :nullify, inverse_of: :old_person
|
||||||
|
|
||||||
validate :owner_xor_pod
|
validate :owner_xor_pod
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ module Workers
|
||||||
DiasporaFederation::Salmon::InvalidEncoding,
|
DiasporaFederation::Salmon::InvalidEncoding,
|
||||||
Diaspora::Federation::AuthorIgnored,
|
Diaspora::Federation::AuthorIgnored,
|
||||||
Diaspora::Federation::InvalidAuthor,
|
Diaspora::Federation::InvalidAuthor,
|
||||||
|
Diaspora::Federation::RecipientClosed,
|
||||||
# TODO: deprecated
|
# TODO: deprecated
|
||||||
DiasporaFederation::Salmon::MissingMagicEnvelope,
|
DiasporaFederation::Salmon::MissingMagicEnvelope,
|
||||||
DiasporaFederation::Salmon::MissingAuthor,
|
DiasporaFederation::Salmon::MissingAuthor,
|
||||||
|
|
|
||||||
|
|
@ -103,18 +103,9 @@ DiasporaFederation.configure do |config|
|
||||||
end
|
end
|
||||||
|
|
||||||
on :receive_entity do |entity, sender, recipient_id|
|
on :receive_entity do |entity, sender, recipient_id|
|
||||||
Person.by_account_identifier(sender).pod.try(:schedule_check_if_needed)
|
sender_person = Person.by_account_identifier(sender)
|
||||||
unless recipient_id.nil?
|
sender_person.pod&.schedule_check_if_needed
|
||||||
User.find_by(id: recipient_id).tap do |user|
|
Diaspora::Federation::Receive.handle_closed_recipient(sender_person, User.find(recipient_id)) if recipient_id
|
||||||
next unless user.person.account_migration
|
|
||||||
|
|
||||||
Diaspora::Federation::Dispatcher.build(
|
|
||||||
user,
|
|
||||||
user.person.account_migration,
|
|
||||||
subscribers: [Person.by_account_identifier(sender)]
|
|
||||||
).dispatch
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
case entity
|
case entity
|
||||||
when DiasporaFederation::Entities::AccountDeletion
|
when DiasporaFederation::Entities::AccountDeletion
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,10 @@ module Diaspora
|
||||||
# Raised, if the author of the existing object doesn't match the received author
|
# Raised, if the author of the existing object doesn't match the received author
|
||||||
class InvalidAuthor < RuntimeError
|
class InvalidAuthor < RuntimeError
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Raised, if the recipient account is closed already
|
||||||
|
class RecipientClosed < RuntimeError
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,15 @@ module Diaspora
|
||||||
public_send(Mappings.receiver_for(entity), entity)
|
public_send(Mappings.receiver_for(entity), entity)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.handle_closed_recipient(sender, recipient)
|
||||||
|
return unless recipient.closed_account?
|
||||||
|
|
||||||
|
entity = recipient.person.account_migration || recipient.person.account_deletion
|
||||||
|
Diaspora::Federation::Dispatcher.build(recipient, entity, subscribers: [sender]).dispatch if entity.present?
|
||||||
|
|
||||||
|
raise Diaspora::Federation::RecipientClosed
|
||||||
|
end
|
||||||
|
|
||||||
def self.account_deletion(entity)
|
def self.account_deletion(entity)
|
||||||
person = author_of(entity)
|
person = author_of(entity)
|
||||||
AccountDeletion.create!(person: person) unless AccountDeletion.where(person: person).exists?
|
AccountDeletion.create!(person: person) unless AccountDeletion.where(person: person).exists?
|
||||||
|
|
|
||||||
|
|
@ -387,12 +387,13 @@ describe "diaspora federation callbacks" do
|
||||||
it "receives a entity for a recipient" do
|
it "receives a entity for a recipient" do
|
||||||
received = Fabricate(:status_message_entity, author: remote_person.diaspora_handle)
|
received = Fabricate(:status_message_entity, author: remote_person.diaspora_handle)
|
||||||
persisted = FactoryGirl.create(:status_message)
|
persisted = FactoryGirl.create(:status_message)
|
||||||
recipient_id = FactoryGirl.create(:user).id
|
recipient = FactoryGirl.create(:user)
|
||||||
|
|
||||||
|
expect(Diaspora::Federation::Receive).to receive(:handle_closed_recipient).with(remote_person, recipient)
|
||||||
expect(Diaspora::Federation::Receive).to receive(:perform).with(received).and_return(persisted)
|
expect(Diaspora::Federation::Receive).to receive(:perform).with(received).and_return(persisted)
|
||||||
expect(Workers::ReceiveLocal).to receive(:perform_async).with(persisted.class.to_s, persisted.id, [recipient_id])
|
expect(Workers::ReceiveLocal).to receive(:perform_async).with(persisted.class.to_s, persisted.id, [recipient.id])
|
||||||
|
|
||||||
DiasporaFederation.callbacks.trigger(:receive_entity, received, received.author, recipient_id)
|
DiasporaFederation.callbacks.trigger(:receive_entity, received, received.author, recipient.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not trigger a ReceiveLocal job if Receive.perform returned nil" do
|
it "does not trigger a ReceiveLocal job if Receive.perform returned nil" do
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ describe AccountDeleter do
|
||||||
it "has all person association keys accounted for" do
|
it "has all person association keys accounted for" do
|
||||||
ignored_or_special_ar_person_associations = %i[comments likes poll_participations contacts notification_actors
|
ignored_or_special_ar_person_associations = %i[comments likes poll_participations contacts notification_actors
|
||||||
notifications owner profile pod conversations messages
|
notifications owner profile pod conversations messages
|
||||||
account_migration]
|
account_deletion account_migration]
|
||||||
all_keys = @account_deletion.normal_ar_person_associates_to_delete + ignored_or_special_ar_person_associations
|
all_keys = @account_deletion.normal_ar_person_associates_to_delete + ignored_or_special_ar_person_associations
|
||||||
expect(all_keys.sort_by(&:to_s)).to eq(Person.reflections.keys.sort_by(&:to_s).map(&:to_sym))
|
expect(all_keys.sort_by(&:to_s)).to eq(Person.reflections.keys.sort_by(&:to_s).map(&:to_sym))
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,58 @@ describe Diaspora::Federation::Receive do
|
||||||
let(:sender) { FactoryGirl.create(:person) }
|
let(:sender) { FactoryGirl.create(:person) }
|
||||||
let(:post) { FactoryGirl.create(:status_message, text: "hello", public: true, author: alice.person) }
|
let(:post) { FactoryGirl.create(:status_message, text: "hello", public: true, author: alice.person) }
|
||||||
|
|
||||||
|
describe ".handle_closed_recipient" do
|
||||||
|
let(:closed_recipient) { FactoryGirl.create(:user).tap {|u| u.person.lock_access! } }
|
||||||
|
|
||||||
|
it "does nothing if the recipient isn't closed" do
|
||||||
|
recipient = FactoryGirl.create(:user)
|
||||||
|
expect { Diaspora::Federation::Receive.handle_closed_recipient(sender, recipient) }.not_to raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises if the recipient is closed, but no AccountMigration and/or AccountDeletion exists" do
|
||||||
|
expect(Diaspora::Federation::Dispatcher).not_to receive(:build)
|
||||||
|
expect { Diaspora::Federation::Receive.handle_closed_recipient(sender, closed_recipient) }
|
||||||
|
.to raise_error(Diaspora::Federation::RecipientClosed)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "resends AccountMigration if the recipient is closed and an AccountMigration exists" do
|
||||||
|
migration = AccountMigration.create(old_person: closed_recipient.person, new_person: FactoryGirl.create(:person))
|
||||||
|
|
||||||
|
dispatcher = double
|
||||||
|
expect(Diaspora::Federation::Dispatcher).to receive(:build)
|
||||||
|
.with(closed_recipient, migration, subscribers: [sender]).and_return(dispatcher)
|
||||||
|
expect(dispatcher).to receive(:dispatch)
|
||||||
|
|
||||||
|
expect { Diaspora::Federation::Receive.handle_closed_recipient(sender, closed_recipient) }
|
||||||
|
.to raise_error(Diaspora::Federation::RecipientClosed)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "resends AccountDeletion if the recipient is closed and an AccountDeletion exists" do
|
||||||
|
deletion = AccountDeletion.create(person: closed_recipient.person)
|
||||||
|
|
||||||
|
dispatcher = double
|
||||||
|
expect(Diaspora::Federation::Dispatcher).to receive(:build)
|
||||||
|
.with(closed_recipient, deletion, subscribers: [sender]).and_return(dispatcher)
|
||||||
|
expect(dispatcher).to receive(:dispatch)
|
||||||
|
|
||||||
|
expect { Diaspora::Federation::Receive.handle_closed_recipient(sender, closed_recipient) }
|
||||||
|
.to raise_error(Diaspora::Federation::RecipientClosed)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "resends AccountMigration if the recipient is closed and both an AccountMigration and AccountDeletion exists" do
|
||||||
|
AccountDeletion.create(person: closed_recipient.person)
|
||||||
|
migration = AccountMigration.create(old_person: closed_recipient.person, new_person: FactoryGirl.create(:person))
|
||||||
|
|
||||||
|
dispatcher = double
|
||||||
|
expect(Diaspora::Federation::Dispatcher).to receive(:build)
|
||||||
|
.with(closed_recipient, migration, subscribers: [sender]).and_return(dispatcher)
|
||||||
|
expect(dispatcher).to receive(:dispatch)
|
||||||
|
|
||||||
|
expect { Diaspora::Federation::Receive.handle_closed_recipient(sender, closed_recipient) }
|
||||||
|
.to raise_error(Diaspora::Federation::RecipientClosed)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe ".account_deletion" do
|
describe ".account_deletion" do
|
||||||
let(:account_deletion_entity) { Fabricate(:account_deletion_entity, author: sender.diaspora_handle) }
|
let(:account_deletion_entity) { Fabricate(:account_deletion_entity, author: sender.diaspora_handle) }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue