From 999c27cd5cb90e3ab9f843789933c5a88f96764b Mon Sep 17 00:00:00 2001 From: Jason Robinson Date: Mon, 1 May 2017 21:58:00 +0300 Subject: [PATCH] Add Diaspora relayable sign as parent --- federation/entities/diaspora/entities.py | 37 +++++++++++-------- federation/entities/diaspora/mappers.py | 4 +- .../tests/entities/diaspora/test_entities.py | 10 +++-- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/federation/entities/diaspora/entities.py b/federation/entities/diaspora/entities.py index 28e7c9e..dfb1694 100644 --- a/federation/entities/diaspora/entities.py +++ b/federation/entities/diaspora/entities.py @@ -32,6 +32,8 @@ class DiasporaEntityMixin(BaseEntity): class DiasporaRelayableMixin(DiasporaEntityMixin): + parent_signature = "" + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._required += ["signature"] @@ -46,17 +48,21 @@ class DiasporaRelayableMixin(DiasporaEntityMixin): def sign(self, private_key): self.signature = create_relayable_signature(private_key, self.to_xml()) + def sign_with_parent(self, private_key): + self.parent_signature = create_relayable_signature(private_key, self.to_xml()) + class DiasporaComment(DiasporaRelayableMixin, Comment): """Diaspora comment.""" def to_xml(self): element = etree.Element("comment") struct_to_xml(element, [ - {'guid': self.guid}, - {'parent_guid': self.target_guid}, - {'author_signature': self.signature}, - {'text': self.raw_content}, - {'diaspora_handle': self.handle}, + {"guid": self.guid}, + {"parent_guid": self.target_guid}, + {"author_signature": self.signature}, + {"parent_author_signature": self.parent_signature}, + {"text": self.raw_content}, + {"diaspora_handle": self.handle}, ]) return element @@ -67,12 +73,12 @@ class DiasporaPost(DiasporaEntityMixin, Post): """Convert to XML message.""" element = etree.Element("status_message") struct_to_xml(element, [ - {'raw_message': self.raw_content}, - {'guid': self.guid}, - {'diaspora_handle': self.handle}, - {'public': 'true' if self.public else 'false'}, - {'created_at': format_dt(self.created_at)}, - {'provider_display_name': self.provider_display_name}, + {"raw_message": self.raw_content}, + {"guid": self.guid}, + {"diaspora_handle": self.handle}, + {"public": "true" if self.public else "false"}, + {"created_at": format_dt(self.created_at)}, + {"provider_display_name": self.provider_display_name}, ]) return element @@ -86,11 +92,12 @@ class DiasporaLike(DiasporaRelayableMixin, Reaction): element = etree.Element("like") struct_to_xml(element, [ {"target_type": "Post"}, - {'guid': self.guid}, - {'parent_guid': self.target_guid}, - {'author_signature': self.signature}, + {"guid": self.guid}, + {"parent_guid": self.target_guid}, + {"author_signature": self.signature}, + {"parent_author_signature": self.parent_signature}, {"positive": "true"}, - {'diaspora_handle': self.handle}, + {"diaspora_handle": self.handle}, ]) return element diff --git a/federation/entities/diaspora/mappers.py b/federation/entities/diaspora/mappers.py index d52939b..dcdd86f 100644 --- a/federation/entities/diaspora/mappers.py +++ b/federation/entities/diaspora/mappers.py @@ -206,6 +206,8 @@ def get_outbound_entity(entity, private_key): outbound = DiasporaRetraction.from_base(entity) if not outbound: raise ValueError("Don't know how to convert this base entity to Diaspora protocol entities.") - if issubclass(cls, DiasporaRelayableMixin): + if issubclass(cls, DiasporaRelayableMixin) and not outbound.signature: + # Sign by author if not signed yet. We don't want to overwrite any existing signature in the case + # that this is being sent by the parent author outbound.sign(private_key) return outbound diff --git a/federation/tests/entities/diaspora/test_entities.py b/federation/tests/entities/diaspora/test_entities.py index cfed7fd..79137f7 100644 --- a/federation/tests/entities/diaspora/test_entities.py +++ b/federation/tests/entities/diaspora/test_entities.py @@ -34,8 +34,9 @@ class TestEntitiesConvertToXML(): result = entity.to_xml() assert result.tag == "comment" converted = b"guidtarget_guid" \ - b"signatureraw_content" \ - b"handle" + b"signature" \ + b"raw_contenthandle" \ + b"" assert etree.tostring(result) == converted def test_like_to_xml(self): @@ -43,8 +44,9 @@ class TestEntitiesConvertToXML(): result = entity.to_xml() assert result.tag == "like" converted = b"Postguidtarget_guid" \ - b"signaturetrue" \ - b"handle" + b"signature" \ + b"truehandle" \ + b"" assert etree.tostring(result) == converted def test_request_to_xml(self):