This commit introduces support for AccountMigration federation message receive. It covers the cases when the new home pod for a user is remote respective to the recepient pod of the message. It also allows to initiate migration locally by a podmin from the rails console. This will give the pods a possibility to understand the account migration event on the federation level and thus future version which will implement migration will be backward compatible with the pods starting from this commit.
102 lines
3.1 KiB
Ruby
102 lines
3.1 KiB
Ruby
def remote_user_on_pod_b
|
|
@remote_on_b ||= create_remote_user("remote-b.net")
|
|
end
|
|
|
|
def remote_user_on_pod_c
|
|
@remote_on_c ||= create_remote_user("remote-c.net")
|
|
end
|
|
|
|
def allow_private_key_fetch(user)
|
|
allow(DiasporaFederation.callbacks).to receive(:trigger).with(
|
|
:fetch_private_key, user.diaspora_handle
|
|
) { user.encryption_key }
|
|
end
|
|
|
|
def allow_public_key_fetch(user)
|
|
allow(DiasporaFederation.callbacks).to receive(:trigger).with(
|
|
:fetch_public_key, user.diaspora_handle
|
|
) { OpenSSL::PKey::RSA.new(user.person.serialized_public_key) }
|
|
end
|
|
|
|
def create_undiscovered_user(pod)
|
|
FactoryGirl.build(:user).tap do |user|
|
|
allow(user).to receive(:person).and_return(
|
|
FactoryGirl.build(:person,
|
|
profile: FactoryGirl.build(:profile),
|
|
serialized_public_key: user.encryption_key.public_key.export,
|
|
pod: Pod.find_or_create_by(url: "http://#{pod}"),
|
|
diaspora_handle: "#{user.username}@#{pod}")
|
|
)
|
|
end
|
|
end
|
|
|
|
def expect_person_discovery(undiscovered_user)
|
|
allow(Person).to receive(:find_or_fetch_by_identifier).with(any_args).and_call_original
|
|
expect(Person).to receive(:find_or_fetch_by_identifier).with(undiscovered_user.diaspora_handle) {
|
|
undiscovered_user.person.save!
|
|
undiscovered_user.person
|
|
}
|
|
end
|
|
|
|
def create_remote_user(pod)
|
|
create_undiscovered_user(pod).tap do |user|
|
|
user.person.save!
|
|
allow_private_key_fetch(user)
|
|
allow_public_key_fetch(user)
|
|
end
|
|
end
|
|
|
|
def allow_callbacks(callbacks)
|
|
callbacks.each do |callback|
|
|
allow(DiasporaFederation.callbacks).to receive(:trigger).with(callback, any_args).and_call_original
|
|
end
|
|
end
|
|
|
|
def create_relayable_entity(entity_name, parent, diaspora_id)
|
|
expect(DiasporaFederation.callbacks).to receive(:trigger).with(
|
|
:fetch_private_key, alice.diaspora_handle
|
|
).at_least(1).times.and_return(nil) if parent == local_parent
|
|
|
|
Fabricate(
|
|
entity_name,
|
|
parent_guid: parent.guid,
|
|
author: diaspora_id,
|
|
poll_answer_guid: parent.respond_to?(:poll_answers) ? parent.poll_answers.first.guid : nil,
|
|
parent: Diaspora::Federation::Entities.related_entity(parent)
|
|
)
|
|
end
|
|
|
|
def create_account_migration_entity(diaspora_id, new_user)
|
|
Fabricate(
|
|
:account_migration_entity,
|
|
author: diaspora_id,
|
|
profile: Diaspora::Federation::Entities.build(new_user.profile)
|
|
)
|
|
end
|
|
|
|
def generate_payload(entity, remote_user, recipient=nil)
|
|
magic_env = DiasporaFederation::Salmon::MagicEnvelope.new(
|
|
entity,
|
|
remote_user.diaspora_handle
|
|
).envelop(remote_user.encryption_key)
|
|
|
|
if recipient
|
|
DiasporaFederation::Salmon::EncryptedMagicEnvelope.encrypt(magic_env, recipient.encryption_key)
|
|
else
|
|
magic_env.to_xml
|
|
end
|
|
end
|
|
|
|
def post_message(payload, recipient=nil)
|
|
if recipient
|
|
inlined_jobs do
|
|
headers = {"CONTENT_TYPE" => "application/json"}
|
|
post "/receive/users/#{recipient.guid}", params: payload, headers: headers
|
|
end
|
|
else
|
|
inlined_jobs do
|
|
headers = {"CONTENT_TYPE" => "application/magic-envelope+xml"}
|
|
post "/receive/public", params: payload, headers: headers
|
|
end
|
|
end
|
|
end
|