From 647bae19b3d4ef06f1c7688fba483392965f6afe Mon Sep 17 00:00:00 2001
From: vtexier <vit@free.fr>
Date: Fri, 29 Nov 2019 17:45:20 +0100
Subject: [PATCH] [enh] #58 refactor ws2p messages classes

---
 duniterpy/documents/ws2p/messages.py | 96 ++++++++--------------------
 1 file changed, 25 insertions(+), 71 deletions(-)

diff --git a/duniterpy/documents/ws2p/messages.py b/duniterpy/documents/ws2p/messages.py
index ff80fc6a..8c43877f 100644
--- a/duniterpy/documents/ws2p/messages.py
+++ b/duniterpy/documents/ws2p/messages.py
@@ -7,9 +7,9 @@ from duniterpy.key import VerifyingKey, SigningKey
 from duniterpy.tools import get_ws2p_challenge
 
 
-class Connect(Document):
+class HandshakeMessage(Document):
     version = 2
-    auth = "CONNECT"
+    auth = ""
 
     def __init__(
         self,
@@ -21,8 +21,8 @@ class Connect(Document):
         """
         Init Connect message document
 
-        :param currency: Name of currency
-        :param pubkey: Public key of node
+        :param currency: Name of the currency
+        :param pubkey: Public key of the node
         :param challenge: [Optional, default=None] Big random string, typically an uuid
         :param signature: [Optional, default=None] Base64 encoded signature of raw formated document
         """
@@ -52,8 +52,11 @@ class Connect(Document):
 
         :return:
         """
-        return "WS2P:CONNECT:{currency}:{pub}:{challenge}".format(
-            currency=self.currency, pub=self.pubkey, challenge=self.challenge
+        return "WS2P:{auth}:{currency}:{pub}:{challenge}".format(
+            auth=self.auth,
+            currency=self.currency,
+            pub=self.pubkey,
+            challenge=self.challenge,
         )
 
     def get_signed_json(self, signing_key: SigningKey) -> str:
@@ -77,8 +80,11 @@ class Connect(Document):
         return self.raw()
 
 
-class Ack(Document):
-    version = 2
+class Connect(HandshakeMessage):
+    auth = "CONNECT"
+
+
+class Ack(HandshakeMessage):
     auth = "ACK"
 
     def __init__(
@@ -89,37 +95,14 @@ class Ack(Document):
         signature: Optional[str] = None,
     ) -> None:
         """
-        Init Ack message document
+        Init Connect message document
 
-        :param currency: Name of currency
-        :param pubkey: Public key of node
-        :param challenge: The challenge sent in the connect message
+        :param currency: Name of the currency
+        :param pubkey: Public key of the node
+        :param challenge: Big random string, typically an uuid
         :param signature: [Optional, default=None] Base64 encoded signature of raw formated document
         """
-        if signature is not None:
-            signatures = [signature]
-        else:
-            signatures = []
-
-        super().__init__(self.version, currency, signatures)
-
-        self.pubkey = pubkey
-        self.challenge = challenge
-
-        if signature is not None:
-            # verify signature
-            verifying_key = VerifyingKey(self.pubkey)
-            verifying_key.verify_document(self)
-
-    def raw(self):
-        """
-        Return the document in raw format
-
-        :return:
-        """
-        return "WS2P:ACK:{currency}:{pub}:{challenge}".format(
-            currency=self.currency, pub=self.pubkey, challenge=self.challenge
-        )
+        super().__init__(currency, pubkey, challenge, signature)
 
     def get_signed_json(self, signing_key: SigningKey) -> str:
         """
@@ -133,12 +116,8 @@ class Ack(Document):
         data = {"auth": self.auth, "pub": self.pubkey, "sig": self.signatures[0]}
         return json.dumps(data)
 
-    def __str__(self) -> str:
-        return self.raw()
-
 
-class Ok(Document):
-    version = 2
+class Ok(HandshakeMessage):
     auth = "OK"
 
     def __init__(
@@ -149,36 +128,14 @@ class Ok(Document):
         signature: Optional[str] = None,
     ) -> None:
         """
-        Init Ok message document
+        Init Connect message document
 
-        :param currency: Name of currency
-        :param pubkey: Public key of node
-        :param challenge: The challenge sent in the connect message
+        :param currency: Name of the currency
+        :param pubkey: Public key of the node
+        :param challenge: Big random string, typically an uuid
         :param signature: [Optional, default=None] Base64 encoded signature of raw formated document
         """
-        if signature is not None:
-            signatures = [signature]
-        else:
-            signatures = []
-        super().__init__(self.version, currency, signatures)
-
-        self.pubkey = pubkey
-        self.challenge = challenge
-
-        if signature is not None:
-            # verify signature
-            verifying_key = VerifyingKey(self.pubkey)
-            verifying_key.verify_document(self)
-
-    def raw(self):
-        """
-        Return the document in raw format
-
-        :return:
-        """
-        return "WS2P:OK:{currency}:{pub}:{challenge}".format(
-            currency=self.currency, pub=self.pubkey, challenge=self.challenge
-        )
+        super().__init__(currency, pubkey, challenge, signature)
 
     def get_signed_json(self, signing_key: SigningKey) -> str:
         """
@@ -192,9 +149,6 @@ class Ok(Document):
         data = {"auth": self.auth, "sig": self.signatures[0]}
         return json.dumps(data)
 
-    def __str__(self) -> str:
-        return self.raw()
-
 
 class DocumentMessage:
     PEER_TYPE_ID = 0
-- 
GitLab