From 681757907204885735bc60b18929938ec2ad04bb Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 14 May 2017 03:46:47 +0200 Subject: [PATCH 1/3] Don't check parent_author_signature for relayables This isn't needed, but we need to check if the sender of the Magic Envelope is the parent author (so we have a valid signature from the parent author there). --- docs/_entities/comment.md | 18 ------ docs/_entities/like.md | 18 ------ docs/_entities/poll_participation.md | 17 ------ docs/federation/relayable.md | 18 +++--- lib/diaspora_federation/entities/relayable.rb | 24 ++++---- spec/integration/comment_integration_spec.rb | 1 - .../entities/relayable_spec.rb | 61 ++++++------------- 7 files changed, 36 insertions(+), 121 deletions(-) diff --git a/docs/_entities/comment.md b/docs/_entities/comment.md index c7e3131..7b8851a 100644 --- a/docs/_entities/comment.md +++ b/docs/_entities/comment.md @@ -16,7 +16,6 @@ See also: [Relayable][relayable] | `text` | [Markdown][markdown] (65535) | The comment text. | | `created_at` | [Timestamp][timestamp] | The create timestamp of the comment. | | `author_signature` | [Signature][signature] | The signature from the author of the comment. | -| `parent_author_signature` | [Signature][signature] | The signature from the parent entity author. | ## Optional Properties @@ -26,8 +25,6 @@ See also: [Relayable][relayable] ## Examples -### From author - ~~~xml alice@example.org @@ -36,21 +33,6 @@ See also: [Relayable][relayable] c3893bf029e7013487753131731751e9 this is a very informative comment cGIsxB5hU/94+rmgIg/Z+OUvXVYcY/kMOvc267ybpk1pT44P1JiWfnI26F1Mta62UjzIW/SjeAO0RIsJRguaISLpXX/d5DJCMpePAZaZiagUbdgH/w4L++fXiPxBKkSm+PB4txxmHGN8FHjwEUJFHJ1m3VfU4w2JC8+IBU93eag= - - -~~~ - -### From parent author - -~~~xml - - alice@example.org - 5c241a3029f8013487763131731751e9 - 2016-07-12T00:49:06Z - c3893bf029e7013487753131731751e9 - this is a very informative comment - cGIsxB5hU/94+rmgIg/Z+OUvXVYcY/kMOvc267ybpk1pT44P1JiWfnI26F1Mta62UjzIW/SjeAO0RIsJRguaISLpXX/d5DJCMpePAZaZiagUbdgH/w4L++fXiPxBKkSm+PB4txxmHGN8FHjwEUJFHJ1m3VfU4w2JC8+IBU93eag= - uzjxUSqR8DQBSBa6abY7R/s9DVzT6UAgTctRcUu5rV5o0iXJD2MR6kp6bsVH3nMbbNvOjwAtrdfz3SVHT2gD8M5PmoFagxK7m5T1c9FB0i+wknoAah0Si0c2sP/BPLnkQ83DgLjF+JZCzMX4sWKvYfyaMjnih1MtQILGyuiwA0E= ~~~ diff --git a/docs/_entities/like.md b/docs/_entities/like.md index e82ed51..fcc635d 100644 --- a/docs/_entities/like.md +++ b/docs/_entities/like.md @@ -21,12 +21,9 @@ See also: [Relayable][relayable] | `parent_type` | [Type][type] | The entity type of the parent. | | `positive` | [Boolean][boolean] | `true` if it is a like, `false` if it is a dislike. | | `author_signature` | [Signature][signature] | The signature from the author of the like. | -| `parent_author_signature` | [Signature][signature] | The signature from the parent entity author. | ## Examples -### From author - ~~~xml true @@ -35,21 +32,6 @@ See also: [Relayable][relayable] 947a854029f7013487753131731751e9 alice@example.org gk8e+K7XRjVRblv8B8PVOf7BpURbf5HrXO5rmq8D/AkPO7lA0+Akwouu5JGKAHIhPR3dfXVp0o6bIDD+e8gtMYRdDd5IHRfBGNk3WsQecnbhmesHy40Qca/dCQcdcXd5aeWHJKeyUrSAvS55U6VUpk/DK/4IIEZfnr0T9+jM8I0= - - -~~~ - -### From parent author - -~~~xml - - true - 947a88f029f7013487753131731751e9 - Post - 947a854029f7013487753131731751e9 - alice@example.org - gk8e+K7XRjVRblv8B8PVOf7BpURbf5HrXO5rmq8D/AkPO7lA0+Akwouu5JGKAHIhPR3dfXVp0o6bIDD+e8gtMYRdDd5IHRfBGNk3WsQecnbhmesHy40Qca/dCQcdcXd5aeWHJKeyUrSAvS55U6VUpk/DK/4IIEZfnr0T9+jM8I0= - 0oAjHO8uIn2Z3Gcmo1KF8su0c7bqI6MzTRq5JagGaZVkFVU8WlNqtwamu6xlmpcAoClGpI5xvbnHzyw5YA8NS8KmUy8BUpg67Mq4QsHHBtueNxHuhgRjszN2V0S8BUKFHGJnnvXmZ/P6YGOOomDgp9I/7zIOownvIm5wj2MotWw= ~~~ diff --git a/docs/_entities/poll_participation.md b/docs/_entities/poll_participation.md index 075ecf9..588a541 100644 --- a/docs/_entities/poll_participation.md +++ b/docs/_entities/poll_participation.md @@ -15,12 +15,9 @@ See also: [Relayable][relayable] | `parent_guid` | [GUID][guid] | The GUID of the [Poll][poll]. | | `poll_answer_guid` | [GUID][guid] | The GUID of the [PollAnswer][poll_answer]. | | `author_signature` | [Signature][signature] | The signature from the author of the poll participation. | -| `parent_author_signature` | [Signature][signature] | The signature from the author of the [Poll][poll]. | ## Examples -### From author - ~~~xml f1eb866029f7013487753131731751e9 @@ -28,20 +25,6 @@ See also: [Relayable][relayable] alice@example.org 2a22db2029e9013487753131731751e9 dT6KbT7kp0bE+s3//ZErxO1wvVIqtD0lY67i81+dO43B4D2m5kjCdzW240eWt/jZmcHIsdxXf4WHNdrb6ZDnamA8I1FUVnLjHA9xexBITQsSLXrcV88UdammSmmOxl1Ac4VUXqFpdavm6a7/MwOJ7+JHP8TbUO9siN+hMfgUbtY= - - -~~~ - -### From parent author - -~~~xml - - f1eb866029f7013487753131731751e9 - 2a22d6c029e9013487753131731751e9 - alice@example.org - 2a22db2029e9013487753131731751e9 - dT6KbT7kp0bE+s3//ZErxO1wvVIqtD0lY67i81+dO43B4D2m5kjCdzW240eWt/jZmcHIsdxXf4WHNdrb6ZDnamA8I1FUVnLjHA9xexBITQsSLXrcV88UdammSmmOxl1Ac4VUXqFpdavm6a7/MwOJ7+JHP8TbUO9siN+hMfgUbtY= - gWasNPpSnMcKBIMWyzfoVO6sr8eRYkhUqy3PIkkh53n/ki+DM9mnh3ayotI0+6un9aq1N3XkS7Vn05ZD3+nHVby6i21XkYgPnbD8pWYuBBj7VGPyahT70BUs/vSvY8KX8V3wYfsPsaiAgJsAFg2UHYdY3r4/oWdIIbBZc21O3zk= ~~~ diff --git a/docs/federation/relayable.md b/docs/federation/relayable.md index 7841a40..158e687 100644 --- a/docs/federation/relayable.md +++ b/docs/federation/relayable.md @@ -21,24 +21,22 @@ All relayables have the following properties: | `guid` | [GUID][guid] | The GUID of the relayable. | | `parent_guid` | [GUID][guid] | The GUID of the parent entity. | | `author_signature` | [Signature][signature] | The signature from the author of the relayable. | -| `parent_author_signature` | [Signature][signature] | The signature from the parent entity author. | ## Relaying -The author of the relayable sends the entity to the parent author. The author must include the `author_signature`. The -`parent_author_signature` may be empty or missing. +The author of the relayable sends the entity to the parent author. The author must include the `author_signature`. -The parent author then must add the `parent_author_signature` and send the entity to all the recipients of the parent -entity. +The parent author then must envelop it in a new [Magic Envelope][magicsig] and send the entity to all the recipients +of the parent entity. If the author and the parent author are on the same server, the author must sign the +`author_signature` and the parent author needs to sign the Magic Envelope. -If someone other then the parent author receives an relayable without a valid `parent_author_signature`, it must be -ignored. If the `author_signature` is missing or invalid, it also must be ignored. +If someone other then the parent author receives a relayable without a valid Magic Envelope signed from +the parent author, it must be ignored. If the `author_signature` is missing or invalid, it also must be ignored. ## Signatures -The string to sign is built with the content of all properties (except the `author_signature` and -`parent_author_signature` itself), concatenated using `;` as separator in the same order as they appear in the XML. The -order in the XML is not specified. +The string to sign is built with the content of all properties (except the `author_signature` itself), +concatenated using `;` as separator in the same order as they appear in the XML. The order in the XML is not specified. This ensures that relayables even work, if the parent author or another recipient does not know all properties of the relayable entity (e.g. older version of diaspora\*). diff --git a/lib/diaspora_federation/entities/relayable.rb b/lib/diaspora_federation/entities/relayable.rb index 2892f82..7366287 100644 --- a/lib/diaspora_federation/entities/relayable.rb +++ b/lib/diaspora_federation/entities/relayable.rb @@ -28,16 +28,15 @@ module DiasporaFederation # @return [String] parent guid # # @!attribute [r] author_signature - # Contains a signature of the entity using the private key of the author of a post itself + # Contains a signature of the entity using the private key of the author of a relayable itself. # The presence of this signature is mandatory. Without it the entity won't be accepted by # a target pod. # @return [String] author signature # # @!attribute [r] parent_author_signature - # Contains a signature of the entity using the private key of the author of a parent post - # This signature is required only when federating from upstream (parent) post author to - # downstream subscribers. This is the case when the parent author has to resend a relayable - # received from one of their subscribers to all others. + # Contains a signature of the entity using the private key of the author of a parent post. + # @deprecated This signature isn't required anymore, because we can check the signature from + # the parent author in the MagicEnvelope. # @return [String] parent author signature # # @!attribute [r] parent @@ -71,18 +70,17 @@ module DiasporaFederation super(data) end - # Verifies the signatures (+author_signature+ and +parent_author_signature+ if needed). + # Verifies the +author_signature+. + # @see DiasporaFederation::Entities::Signable#verify_signature + # # @raise [SignatureVerificationFailed] if the signature is not valid # @raise [PublicKeyNotFound] if no public key is found - def verify_signatures - verify_signature(author, :author_signature) - - # This happens only on downstream federation. - verify_signature(parent.author, :parent_author_signature) unless parent.local + def verify_signature + super(author, :author_signature) end def sender_valid?(sender) - sender == author || sender == parent.author + (sender == author && parent.local) || sender == parent.author end # @return [String] string representation of this object @@ -178,7 +176,7 @@ module DiasporaFederation additional_data = properties_hash.reject {|key, _| class_props.has_key?(key) } fetch_parent(properties_hash) - new(properties_hash, property_order, additional_data).tap(&:verify_signatures) + new(properties_hash, property_order, additional_data).tap(&:verify_signature) end private diff --git a/spec/integration/comment_integration_spec.rb b/spec/integration/comment_integration_spec.rb index 769f480..838f7b4 100644 --- a/spec/integration/comment_integration_spec.rb +++ b/spec/integration/comment_integration_spec.rb @@ -224,7 +224,6 @@ XML before do expect_callback(:fetch_public_key, author).and_return(author_key.public_key) - expect_callback(:fetch_public_key, parent.author).and_return(parent_key.public_key) expect_callback(:fetch_related_entity, "Post", parent_guid).and_return(parent) end diff --git a/spec/lib/diaspora_federation/entities/relayable_spec.rb b/spec/lib/diaspora_federation/entities/relayable_spec.rb index 0d96e99..4b02a6a 100644 --- a/spec/lib/diaspora_federation/entities/relayable_spec.rb +++ b/spec/lib/diaspora_federation/entities/relayable_spec.rb @@ -25,16 +25,15 @@ module DiasporaFederation end end - describe "#verify_signatures" do + describe "#verify_signature" do it "doesn't raise anything if correct signatures were passed" do hash[:author_signature] = sign_with_key(author_pkey, signature_data) hash[:parent_author_signature] = sign_with_key(parent_pkey, signature_data) hash[:parent] = remote_parent expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) - expect { Entities::SomeRelayable.new(hash, signature_order).verify_signatures }.not_to raise_error + expect { Entities::SomeRelayable.new(hash, signature_order).verify_signature }.not_to raise_error end it "doesn't raise anything if correct signatures with new property were passed" do @@ -46,10 +45,9 @@ module DiasporaFederation hash[:parent] = remote_parent expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) expect { - Entities::SomeRelayable.new(hash, signature_order, "new_property" => new_property).verify_signatures + Entities::SomeRelayable.new(hash, signature_order, "new_property" => new_property).verify_signature }.not_to raise_error end @@ -57,7 +55,7 @@ module DiasporaFederation expect_callback(:fetch_public_key, anything).and_return(nil) expect { - Entities::SomeRelayable.new(hash, signature_order).verify_signatures + Entities::SomeRelayable.new(hash, signature_order).verify_signature }.to raise_error Entities::Relayable::PublicKeyNotFound end @@ -67,7 +65,7 @@ module DiasporaFederation expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) expect { - Entities::SomeRelayable.new(hash, signature_order).verify_signatures + Entities::SomeRelayable.new(hash, signature_order).verify_signature }.to raise_error Entities::Relayable::SignatureVerificationFailed end @@ -77,56 +75,28 @@ module DiasporaFederation expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) expect { - Entities::SomeRelayable.new(hash, signature_order).verify_signatures + Entities::SomeRelayable.new(hash, signature_order).verify_signature }.to raise_error Entities::Relayable::SignatureVerificationFailed end - it "raises when no public key for parent author was fetched" do - hash[:author_signature] = sign_with_key(author_pkey, signature_data) - hash[:parent] = remote_parent - - expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(nil) - - expect { - Entities::SomeRelayable.new(hash, signature_order).verify_signatures - }.to raise_error Entities::Relayable::PublicKeyNotFound - end - - it "raises when no parent author signature was passed" do + it "doesn't raise when no parent author signature was passed" do hash[:author_signature] = sign_with_key(author_pkey, signature_data) hash[:parent_author_signature] = nil hash[:parent] = remote_parent expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) - expect { - Entities::SomeRelayable.new(hash, signature_order).verify_signatures - }.to raise_error Entities::Relayable::SignatureVerificationFailed + expect { Entities::SomeRelayable.new(hash, signature_order).verify_signature }.not_to raise_error end - it "raises when bad parent author signature was passed" do - hash[:author_signature] = sign_with_key(author_pkey, signature_data) - hash[:parent_author_signature] = sign_with_key(parent_pkey, "bad signed string") - hash[:parent] = remote_parent - - expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) - - expect { - Entities::SomeRelayable.new(hash, signature_order).verify_signatures - }.to raise_error Entities::Relayable::SignatureVerificationFailed - end - - it "doesn't raise if parent_author_signature isn't set but we're on upstream federation" do + it "doesn't raise when no parent author signature was passed and we're on upstream federation" do hash[:author_signature] = sign_with_key(author_pkey, signature_data) hash[:parent_author_signature] = nil hash[:parent] = local_parent expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect { Entities::SomeRelayable.new(hash, signature_order).verify_signatures }.not_to raise_error + expect { Entities::SomeRelayable.new(hash, signature_order).verify_signature }.not_to raise_error end end @@ -228,7 +198,6 @@ XML before do expect_callback(:fetch_related_entity, "Parent", parent_guid).and_return(remote_parent) expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) end let(:new_signature_data) { "#{author};#{guid};#{parent_guid};#{new_property};#{property}" } @@ -374,7 +343,6 @@ XML before do expect_callback(:fetch_related_entity, "Parent", parent_guid).and_return(remote_parent) expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) end context "when properties are sorted and there is an unknown property" do @@ -475,7 +443,6 @@ XML context "fetch parent" do before do expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) - expect_callback(:fetch_public_key, remote_parent.author).and_return(parent_pkey.public_key) expect_callback(:fetch_private_key, author).and_return(author_pkey) expect_callback(:fetch_private_key, remote_parent.author).and_return(parent_pkey) end @@ -508,12 +475,18 @@ XML end describe "#sender_valid?" do - it "allows author" do + it "allows author if the parent is local" do entity = Entities::SomeRelayable.new(hash) expect(entity.sender_valid?(author)).to be_truthy end + it "does not allow the author if the parent is not local" do + entity = Entities::SomeRelayable.new(hash.merge(parent: remote_parent)) + + expect(entity.sender_valid?(author)).to be_falsey + end + it "allows parent author" do entity = Entities::SomeRelayable.new(hash) From 57edc8baabcf884b0ac5395266ffe148cff5da1d Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Sun, 14 May 2017 04:44:09 +0200 Subject: [PATCH 2/3] Don't check the author_signature when the author is the parent author The signature from the Magic Envelope is enough for that scenario, because it's all from the same person. --- docs/federation/relayable.md | 7 +++++-- lib/diaspora_federation/entities/relayable.rb | 4 ++-- spec/lib/diaspora_federation/entities/relayable_spec.rb | 9 +++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/federation/relayable.md b/docs/federation/relayable.md index 158e687..742b5ae 100644 --- a/docs/federation/relayable.md +++ b/docs/federation/relayable.md @@ -24,14 +24,17 @@ All relayables have the following properties: ## Relaying -The author of the relayable sends the entity to the parent author. The author must include the `author_signature`. +If the author is not the same as the parent author, the author of the relayable sends the entity to the parent author +and the author must include the `author_signature`. The parent author then must envelop it in a new [Magic Envelope][magicsig] and send the entity to all the recipients of the parent entity. If the author and the parent author are on the same server, the author must sign the `author_signature` and the parent author needs to sign the Magic Envelope. If someone other then the parent author receives a relayable without a valid Magic Envelope signed from -the parent author, it must be ignored. If the `author_signature` is missing or invalid, it also must be ignored. +the parent author, it must be ignored. If the author is not the same as the parent author and the `author_signature` +is missing or invalid, it also must be ignored. If the author is the same as the parent author, the `author_signature` +can be missing, because a valid signature in the Magic Envelope from the author is enough in that case. ## Signatures diff --git a/lib/diaspora_federation/entities/relayable.rb b/lib/diaspora_federation/entities/relayable.rb index 7366287..97c61a1 100644 --- a/lib/diaspora_federation/entities/relayable.rb +++ b/lib/diaspora_federation/entities/relayable.rb @@ -70,13 +70,13 @@ module DiasporaFederation super(data) end - # Verifies the +author_signature+. + # Verifies the +author_signature+ if needed. # @see DiasporaFederation::Entities::Signable#verify_signature # # @raise [SignatureVerificationFailed] if the signature is not valid # @raise [PublicKeyNotFound] if no public key is found def verify_signature - super(author, :author_signature) + super(author, :author_signature) unless author == parent.author end def sender_valid?(sender) diff --git a/spec/lib/diaspora_federation/entities/relayable_spec.rb b/spec/lib/diaspora_federation/entities/relayable_spec.rb index 4b02a6a..86ecc36 100644 --- a/spec/lib/diaspora_federation/entities/relayable_spec.rb +++ b/spec/lib/diaspora_federation/entities/relayable_spec.rb @@ -69,6 +69,15 @@ module DiasporaFederation }.to raise_error Entities::Relayable::SignatureVerificationFailed end + it "doesn't raise when no author signature was passed, but the author is also the parent author" do + hash[:author_signature] = nil + hash[:parent] = Fabricate(:related_entity, author: author, local: false) + + expect { + Entities::SomeRelayable.new(hash, signature_order).verify_signature + }.not_to raise_error + end + it "raises when bad author signature was passed" do hash[:author_signature] = sign_with_key(author_pkey, "bad signed string") From a05c6fe6d172ef1b34306e3af11a871cd70b336c Mon Sep 17 00:00:00 2001 From: Benjamin Neff Date: Tue, 23 May 2017 03:20:58 +0200 Subject: [PATCH 3/3] Remove parent_author_signature from json --- lib/diaspora_federation/entities/relayable.rb | 6 ++++-- .../schemas/federation_entities.json | 3 +-- .../diaspora_federation/entities/comment_spec.rb | 1 - .../diaspora_federation/entities/like_spec.rb | 1 - .../entities/poll_participation_spec.rb | 1 - .../entities/relayable_spec.rb | 16 +++++----------- spec/support/helper_methods.rb | 2 +- spec/support/shared_entity_specs.rb | 6 +++--- 8 files changed, 14 insertions(+), 22 deletions(-) diff --git a/lib/diaspora_federation/entities/relayable.rb b/lib/diaspora_federation/entities/relayable.rb index 97c61a1..8294839 100644 --- a/lib/diaspora_federation/entities/relayable.rb +++ b/lib/diaspora_federation/entities/relayable.rb @@ -134,7 +134,7 @@ module DiasporaFederation def enriched_properties super.merge(additional_data).tap do |hash| hash[:author_signature] = author_signature || sign_with_author - hash[:parent_author_signature] = parent_author_signature || sign_with_parent_author_if_available.to_s + hash.delete(:parent_author_signature) end end @@ -142,7 +142,9 @@ module DiasporaFederation # # @return [Hash] sorted xml elements def xml_elements - data = super + data = super.tap do |hash| + hash[:parent_author_signature] = parent_author_signature || sign_with_parent_author_if_available.to_s + end order = signature_order + %i(author_signature parent_author_signature) order.map {|element| [element, data[element] || ""] }.to_h end diff --git a/lib/diaspora_federation/schemas/federation_entities.json b/lib/diaspora_federation/schemas/federation_entities.json index a243efb..b9a8012 100644 --- a/lib/diaspora_federation/schemas/federation_entities.json +++ b/lib/diaspora_federation/schemas/federation_entities.json @@ -46,8 +46,7 @@ "author": { "type": "string" }, "guid": { "$ref": "#/definitions/guid" }, "parent_guid": { "$ref": "#/definitions/guid" }, - "author_signature": { "$ref": "#/definitions/signature" }, - "parent_author_signature": { "$ref": "#/definitions/signature" } + "author_signature": { "$ref": "#/definitions/signature" } }, "required": [ "author", "guid", "parent_guid" diff --git a/spec/lib/diaspora_federation/entities/comment_spec.rb b/spec/lib/diaspora_federation/entities/comment_spec.rb index 2ea3099..99ca055 100644 --- a/spec/lib/diaspora_federation/entities/comment_spec.rb +++ b/spec/lib/diaspora_federation/entities/comment_spec.rb @@ -32,7 +32,6 @@ XML "guid": "#{data[:guid]}", "parent_guid": "#{parent.guid}", "author_signature": "#{data[:author_signature]}", - "parent_author_signature": "#{data[:parent_author_signature]}", "text": "#{data[:text]}", "created_at": "#{data[:created_at].iso8601}" }, diff --git a/spec/lib/diaspora_federation/entities/like_spec.rb b/spec/lib/diaspora_federation/entities/like_spec.rb index ae90f5b..8368c8c 100644 --- a/spec/lib/diaspora_federation/entities/like_spec.rb +++ b/spec/lib/diaspora_federation/entities/like_spec.rb @@ -32,7 +32,6 @@ XML "guid": "#{data[:guid]}", "parent_guid": "#{parent.guid}", "author_signature": "#{data[:author_signature]}", - "parent_author_signature": "#{data[:parent_author_signature]}", "parent_type": "#{parent.entity_type}", "positive": #{data[:positive]} }, diff --git a/spec/lib/diaspora_federation/entities/poll_participation_spec.rb b/spec/lib/diaspora_federation/entities/poll_participation_spec.rb index 8d3c438..424d767 100644 --- a/spec/lib/diaspora_federation/entities/poll_participation_spec.rb +++ b/spec/lib/diaspora_federation/entities/poll_participation_spec.rb @@ -30,7 +30,6 @@ XML "guid": "#{data[:guid]}", "parent_guid": "#{parent.guid}", "author_signature": "#{data[:author_signature]}", - "parent_author_signature": "#{data[:parent_author_signature]}", "poll_answer_guid": "#{data[:poll_answer_guid]}" }, "property_order": [ diff --git a/spec/lib/diaspora_federation/entities/relayable_spec.rb b/spec/lib/diaspora_federation/entities/relayable_spec.rb index 86ecc36..8fb01b5 100644 --- a/spec/lib/diaspora_federation/entities/relayable_spec.rb +++ b/spec/lib/diaspora_federation/entities/relayable_spec.rb @@ -307,25 +307,21 @@ XML ) end - it "computes correct signatures for the entity with new unknown elements" do + it "computes correct author_signature for the entity with new unknown elements" do expect_callback(:fetch_private_key, author).and_return(author_pkey) - expect_callback(:fetch_private_key, local_parent.author).and_return(parent_pkey) property_order = [:author, :guid, :parent_guid, "new_property", :property] signature_data_with_new_property = "#{author};#{guid};#{parent_guid};#{new_property};#{property}" json_hash = Entities::SomeRelayable.new(hash, property_order, "new_property" => new_property).to_json author_signature = json_hash[:entity_data][:author_signature] - parent_author_signature = json_hash[:entity_data][:parent_author_signature] expect(verify_signature(author_pkey, author_signature, signature_data_with_new_property)).to be_truthy - expect(verify_signature(parent_pkey, parent_author_signature, signature_data_with_new_property)).to be_truthy end - it "doesn't change signatures if they are already set" do + it "doesn't change author_signature if it is already set" do json = Entities::SomeRelayable.new(hash_with_fake_signatures).to_json.to_json expect(json).to include_json(entity_data: {author_signature: "aa"}) - expect(json).to include_json(entity_data: {parent_author_signature: "bb"}) end it "raises when author_signature not set and key isn't supplied" do @@ -336,12 +332,11 @@ XML }.to raise_error Entities::Relayable::AuthorPrivateKeyNotFound end - it "doesn't set parent_author_signature if key isn't supplied" do + it "doesn't contain the parent_author_signature" do expect_callback(:fetch_private_key, author).and_return(author_pkey) - expect_callback(:fetch_private_key, local_parent.author).and_return(nil) - json = Entities::SomeRelayable.new(hash).to_json.to_json - expect(json).to include_json(entity_data: {parent_author_signature: ""}) + json = Entities::SomeRelayable.new(hash).to_json + expect(json[:entity_data]).not_to include(:parent_author_signature) end end @@ -453,7 +448,6 @@ XML before do expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key) expect_callback(:fetch_private_key, author).and_return(author_pkey) - expect_callback(:fetch_private_key, remote_parent.author).and_return(parent_pkey) end let(:entity) { Entities::SomeRelayable.new(hash) } diff --git a/spec/support/helper_methods.rb b/spec/support/helper_methods.rb index 9ac2352..12a6f18 100644 --- a/spec/support/helper_methods.rb +++ b/spec/support/helper_methods.rb @@ -14,7 +14,7 @@ end # signature methods def add_signatures(hash, klass=described_class) - properties = klass.new(hash).send(:enriched_properties) + properties = klass.new(hash).send(:xml_elements) hash[:author_signature] = properties[:author_signature] hash[:parent_author_signature] = properties[:parent_author_signature] end diff --git a/spec/support/shared_entity_specs.rb b/spec/support/shared_entity_specs.rb index 66c97f3..0ff8cae 100644 --- a/spec/support/shared_entity_specs.rb +++ b/spec/support/shared_entity_specs.rb @@ -1,4 +1,5 @@ def entity_hash_from(hash) + hash.delete(:parent_author_signature) hash.map {|key, value| if [String, TrueClass, FalseClass, Integer, NilClass].any? {|c| value.is_a? c } [key, value] @@ -136,10 +137,9 @@ shared_examples "a JSON Entity" do it "contains JSON properties for each of the entity properties with the entity_data property" do entity_data = entity_hash_from(data) entity_data.delete(:parent) - nested_elements = entity_data.select {|_key, value| value.is_a?(Array) || value.is_a?(Hash) } - entity_data.reject! {|_key, value| value.is_a?(Array) || value.is_a?(Hash) } + nested_elements, simple_props = entity_data.partition {|_key, value| value.is_a?(Array) || value.is_a?(Hash) } - expect(to_json_output).to include_json(entity_data: entity_data) + expect(to_json_output).to include_json(entity_data: simple_props.to_h) nested_elements.each {|key, value| type = described_class.class_props[key] if value.is_a?(Array)