diff --git a/lib/diaspora_federation/federation/fetcher.rb b/lib/diaspora_federation/federation/fetcher.rb index a985af2..db63c56 100644 --- a/lib/diaspora_federation/federation/fetcher.rb +++ b/lib/diaspora_federation/federation/fetcher.rb @@ -11,9 +11,9 @@ module DiasporaFederation response = HttpClient.get(url) raise "Failed to fetch #{url}: #{response.status}" unless response.success? - magic_env = Nokogiri::XML::Document.parse(response.body).root - entity = Salmon::MagicEnvelope.unenvelop(magic_env) - DiasporaFederation.callbacks.trigger(:receive_entity, entity) + magic_env_xml = Nokogiri::XML::Document.parse(response.body).root + magic_env = Salmon::MagicEnvelope.unenvelop(magic_env_xml) + DiasporaFederation.callbacks.trigger(:receive_entity, magic_env.payload) rescue => e raise NotFetchable, "Failed to fetch #{entity_type}:#{guid} from #{author}: #{e.class}: #{e.message}" end diff --git a/lib/diaspora_federation/federation/receiver.rb b/lib/diaspora_federation/federation/receiver.rb index 5b5ed1c..cfd6d4d 100644 --- a/lib/diaspora_federation/federation/receiver.rb +++ b/lib/diaspora_federation/federation/receiver.rb @@ -10,7 +10,7 @@ module DiasporaFederation Salmon::Slap.from_xml(data).entity else magic_env_xml = Nokogiri::XML::Document.parse(data).root - Salmon::MagicEnvelope.unenvelop(magic_env_xml) + Salmon::MagicEnvelope.unenvelop(magic_env_xml).payload end receive(received_message) end @@ -27,7 +27,7 @@ module DiasporaFederation Salmon::EncryptedSlap.from_xml(data, recipient_private_key).entity else magic_env_xml = Salmon::EncryptedMagicEnvelope.decrypt(data, recipient_private_key) - Salmon::MagicEnvelope.unenvelop(magic_env_xml) + Salmon::MagicEnvelope.unenvelop(magic_env_xml).payload end receive(received_message, recipient_id) end diff --git a/lib/diaspora_federation/salmon/magic_envelope.rb b/lib/diaspora_federation/salmon/magic_envelope.rb index bf7e833..ad8ef69 100644 --- a/lib/diaspora_federation/salmon/magic_envelope.rb +++ b/lib/diaspora_federation/salmon/magic_envelope.rb @@ -114,6 +114,8 @@ module DiasporaFederation raise ArgumentError unless magic_env.instance_of?(Nokogiri::XML::Element) raise InvalidEnvelope unless envelope_valid?(magic_env) + + sender ||= sender(magic_env) raise InvalidSignature unless signature_valid?(magic_env, sender) raise InvalidEncoding unless encoding_valid?(magic_env) @@ -121,7 +123,7 @@ module DiasporaFederation data = read_and_decrypt_data(magic_env, cipher_params) - XmlPayload.unpack(Nokogiri::XML::Document.parse(data).root) + new(XmlPayload.unpack(Nokogiri::XML::Document.parse(data).root), sender) end private @@ -169,8 +171,6 @@ module DiasporaFederation # @param [String] sender diaspora-ID of the sender or nil # @return [Boolean] def self.signature_valid?(env, sender) - sender ||= sender(env) - subject = sig_subject([Base64.urlsafe_decode64(env.at_xpath("me:data").content), env.at_xpath("me:data")["type"], env.at_xpath("me:encoding").content, diff --git a/spec/controllers/diaspora_federation/fetch_controller_spec.rb b/spec/controllers/diaspora_federation/fetch_controller_spec.rb index 0070568..de3ade6 100644 --- a/spec/controllers/diaspora_federation/fetch_controller_spec.rb +++ b/spec/controllers/diaspora_federation/fetch_controller_spec.rb @@ -20,13 +20,15 @@ module DiasporaFederation :fetch_public_key_by_diaspora_id, alice.diaspora_id ).and_return(alice.public_key) - magic_env = Nokogiri::XML::Document.parse(response.body).root - entity = Salmon::MagicEnvelope.unenvelop(magic_env) + magic_env_xml = Nokogiri::XML::Document.parse(response.body).root + magic_env = Salmon::MagicEnvelope.unenvelop(magic_env_xml) + entity = magic_env.payload expect(entity).to be_a(Entities::StatusMessage) expect(entity.guid).to eq(guid) expect(entity.author).to eq(alice.diaspora_id) expect(entity.raw_message).to eq(post.raw_message) + expect(magic_env.sender).to eq(alice.diaspora_id) end it "works with type 'post'" do @@ -43,13 +45,15 @@ module DiasporaFederation :fetch_public_key_by_diaspora_id, alice.diaspora_id ).and_return(alice.public_key) - magic_env = Nokogiri::XML::Document.parse(response.body).root - entity = Salmon::MagicEnvelope.unenvelop(magic_env) + magic_env_xml = Nokogiri::XML::Document.parse(response.body).root + magic_env = Salmon::MagicEnvelope.unenvelop(magic_env_xml) + entity = magic_env.payload expect(entity).to be_a(Entities::StatusMessage) expect(entity.guid).to eq(guid) expect(entity.author).to eq(alice.diaspora_id) expect(entity.raw_message).to eq(post.raw_message) + expect(magic_env.sender).to eq(alice.diaspora_id) end it "redirects when the entity is from another pod" do diff --git a/spec/lib/diaspora_federation/salmon/magic_envelope_spec.rb b/spec/lib/diaspora_federation/salmon/magic_envelope_spec.rb index 36ea707..e1c5a62 100644 --- a/spec/lib/diaspora_federation/salmon/magic_envelope_spec.rb +++ b/spec/lib/diaspora_federation/salmon/magic_envelope_spec.rb @@ -172,9 +172,18 @@ module DiasporaFederation :fetch_public_key_by_diaspora_id, sender ).and_return(privkey.public_key) - entity = Salmon::MagicEnvelope.unenvelop(envelope.envelop(privkey), sender) - expect(entity).to be_an_instance_of Entities::TestEntity - expect(entity.test).to eq("asdf") + magic_env = Salmon::MagicEnvelope.unenvelop(envelope.envelop(privkey), sender) + expect(magic_env.payload).to be_an_instance_of Entities::TestEntity + expect(magic_env.payload.test).to eq("asdf") + end + + it "returns the original sender" do + allow(DiasporaFederation.callbacks).to receive(:trigger).with( + :fetch_public_key_by_diaspora_id, sender + ).and_return(privkey.public_key) + + magic_env = Salmon::MagicEnvelope.unenvelop(envelope.envelop(privkey), sender) + expect(magic_env.sender).to eq(sender) end it "decrypts on the fly, when cipher params are present" do @@ -182,13 +191,13 @@ module DiasporaFederation :fetch_public_key_by_diaspora_id, sender ).and_return(privkey.public_key) - params = envelope.encrypt! + env = Salmon::MagicEnvelope.new(payload) + params = env.encrypt! + env_xml = env.envelop(privkey) - env_xml = envelope.envelop(privkey) - - entity = Salmon::MagicEnvelope.unenvelop(env_xml, sender, params) - expect(entity).to be_an_instance_of Entities::TestEntity - expect(entity.test).to eq("asdf") + magic_env = Salmon::MagicEnvelope.unenvelop(env_xml, sender, params) + expect(magic_env.payload).to be_an_instance_of Entities::TestEntity + expect(magic_env.payload.test).to eq("asdf") end context "use key_id from magic envelope" do @@ -197,9 +206,18 @@ module DiasporaFederation :fetch_public_key_by_diaspora_id, sender ).and_return(privkey.public_key) - entity = Salmon::MagicEnvelope.unenvelop(envelope.envelop(privkey)) - expect(entity).to be_an_instance_of Entities::TestEntity - expect(entity.test).to eq("asdf") + magic_env = Salmon::MagicEnvelope.unenvelop(envelope.envelop(privkey)) + expect(magic_env.payload).to be_an_instance_of Entities::TestEntity + expect(magic_env.payload.test).to eq("asdf") + end + + it "returns the original sender" do + expect(DiasporaFederation.callbacks).to receive(:trigger).with( + :fetch_public_key_by_diaspora_id, sender + ).and_return(privkey.public_key) + + magic_env = Salmon::MagicEnvelope.unenvelop(envelope.envelop(privkey)) + expect(magic_env.sender).to eq(sender) end it "raises if the magic envelope has no key_id" do