From 5714e83ab2d8e15d83757d1c0020a23fa90485c6 Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 24 Oct 2021 17:17:59 +0200 Subject: [PATCH] Store signatures of AccountMigrations if the old person is local That way it can be re-used when sending the AccountMigrations to other pods again if a message for the migrated account is received. fixes #7902 closes #8309 --- Changelog.md | 1 + ...2641_add_signature_to_account_migration.rb | 7 +++++++ lib/diaspora/federation/entities.rb | 5 +++-- lib/diaspora/federation/receive.rb | 13 +++++++++---- spec/lib/diaspora/federation/entities_spec.rb | 13 +++++++++++++ spec/lib/diaspora/federation/receive_spec.rb | 19 ++++++++++++++++--- 6 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 db/migrate/20211024142641_add_signature_to_account_migration.rb diff --git a/Changelog.md b/Changelog.md index e754c03d9..96466dfb0 100644 --- a/Changelog.md +++ b/Changelog.md @@ -18,6 +18,7 @@ * Send `AccountMigration` if receiving message to a migrated account [#8288](https://github.com/diaspora/diaspora/pull/8288) * Add podmin mail address to the footer [#8242](https://github.com/diaspora/diaspora/pull/8242) * Add username to password-reset mail [#8037](https://github.com/diaspora/diaspora/pull/8037) +* Resend account migration and deletion for closed recipients [#8309](https://github.com/diaspora/diaspora/pull/8309) # 0.7.15.0 diff --git a/db/migrate/20211024142641_add_signature_to_account_migration.rb b/db/migrate/20211024142641_add_signature_to_account_migration.rb new file mode 100644 index 000000000..e6acbcebe --- /dev/null +++ b/db/migrate/20211024142641_add_signature_to_account_migration.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddSignatureToAccountMigration < ActiveRecord::Migration[5.2] + def change + add_column :account_migrations, :signature, :text + end +end diff --git a/lib/diaspora/federation/entities.rb b/lib/diaspora/federation/entities.rb index 8a842b409..4a77f8ef7 100644 --- a/lib/diaspora/federation/entities.rb +++ b/lib/diaspora/federation/entities.rb @@ -26,8 +26,9 @@ module Diaspora def self.account_migration(account_migration) DiasporaFederation::Entities::AccountMigration.new( - author: account_migration.sender.diaspora_handle, - profile: profile(account_migration.new_person.profile) + author: account_migration.sender.diaspora_handle, + profile: profile(account_migration.new_person.profile), + signature: account_migration.signature ) end diff --git a/lib/diaspora/federation/receive.rb b/lib/diaspora/federation/receive.rb index 80773ac95..edbdf2b9f 100644 --- a/lib/diaspora/federation/receive.rb +++ b/lib/diaspora/federation/receive.rb @@ -29,10 +29,15 @@ module Diaspora def self.account_migration(entity) old_person = author_of(entity) profile = profile(entity.profile) - return if AccountMigration.where(old_person: old_person, new_person: profile.person).exists? - AccountMigration.create!(old_person: old_person, new_person: profile.person) - rescue => e # rubocop:disable Lint/RescueWithoutErrorClass - raise e unless AccountMigration.where(old_person: old_person, new_person: profile.person).exists? + return if AccountMigration.exists?(old_person: old_person, new_person: profile.person) + + AccountMigration.create!(old_person: old_person, new_person: profile.person).tap do |migration| + migration.signature = entity.signature if old_person.local? + migration.save! + end + rescue StandardError => e + raise e unless AccountMigration.exists?(old_person: old_person, new_person: profile.person) + logger.warn "ignoring error on receive #{entity}: #{e.class}: #{e.message}" nil end diff --git a/spec/lib/diaspora/federation/entities_spec.rb b/spec/lib/diaspora/federation/entities_spec.rb index 03f625573..f0e3328ee 100644 --- a/spec/lib/diaspora/federation/entities_spec.rb +++ b/spec/lib/diaspora/federation/entities_spec.rb @@ -18,6 +18,19 @@ describe Diaspora::Federation::Entities do expect(federation_entity).to be_instance_of(DiasporaFederation::Entities::AccountMigration) expect(federation_entity.author).to eq(diaspora_entity.old_person.diaspora_handle) expect(federation_entity.profile.author).to eq(diaspora_entity.new_person.diaspora_handle) + expect(federation_entity.signature).to be_nil + end + + it "builds an account migration with signature" do + diaspora_entity = FactoryGirl.build(:account_migration, + old_person: FactoryGirl.create(:user).person, + signature: "aa") + federation_entity = described_class.build(diaspora_entity) + + expect(federation_entity).to be_instance_of(DiasporaFederation::Entities::AccountMigration) + expect(federation_entity.author).to eq(diaspora_entity.old_person.diaspora_handle) + expect(federation_entity.profile.author).to eq(diaspora_entity.new_person.diaspora_handle) + expect(federation_entity.signature).to eq(diaspora_entity.signature) end it "builds a comment" do diff --git a/spec/lib/diaspora/federation/receive_spec.rb b/spec/lib/diaspora/federation/receive_spec.rb index e34c1bb2c..a868222a9 100644 --- a/spec/lib/diaspora/federation/receive_spec.rb +++ b/spec/lib/diaspora/federation/receive_spec.rb @@ -91,13 +91,16 @@ describe Diaspora::Federation::Receive do let(:new_person) { FactoryGirl.create(:person) } let(:profile_entity) { Fabricate(:profile_entity, author: new_person.diaspora_handle) } let(:account_migration_entity) { - Fabricate(:account_migration_entity, author: sender.diaspora_handle, profile: profile_entity) + Fabricate(:account_migration_entity, author: sender.diaspora_handle, profile: profile_entity, signature: "aa") } it "saves the account deletion" do - Diaspora::Federation::Receive.account_migration(account_migration_entity) + received = Diaspora::Federation::Receive.account_migration(account_migration_entity) - expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy + migration = AccountMigration.find_by(old_person: sender, new_person: new_person) + + expect(received).to eq(migration) + expect(migration.signature).to be_nil end it "ignores duplicate the account migrations" do @@ -120,6 +123,16 @@ describe Diaspora::Federation::Receive do expect(AccountMigration.exists?(old_person: sender, new_person: new_person)).to be_truthy end + + it "saves signature from the new person if the old person is local" do + sender = FactoryGirl.create(:user).person + account_migration_entity = + Fabricate(:account_migration_entity, author: sender.diaspora_handle, profile: profile_entity, signature: "aa") + + received = Diaspora::Federation::Receive.perform(account_migration_entity) + + expect(received.signature).to eq("aa") + end end describe ".comment" do