From be36252131c8bd06828ed28ef09e6f2704bb172e Mon Sep 17 00:00:00 2001 From: Jonathan Zernik Date: Wed, 5 Aug 2020 23:39:52 -0700 Subject: [PATCH] Add buy page (#231) * Add todo comments to handle exceptions in upload/download * Log the proof and expected proof in get offer task * Convert offer message to namedtuple * Successfully save offer in database --- squeakserver/core/offer.py | 15 +++++++++++++++ squeakserver/network/peer_client.py | 3 ++- squeakserver/node/peer_download.py | 1 + squeakserver/node/peer_get_offer.py | 25 ++++++++++++++++++++++++- squeakserver/node/peer_upload.py | 1 + squeakserver/server/postgres_db.py | 28 ++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 squeakserver/core/offer.py diff --git a/squeakserver/core/offer.py b/squeakserver/core/offer.py new file mode 100644 index 00000000..ebfc8b67 --- /dev/null +++ b/squeakserver/core/offer.py @@ -0,0 +1,15 @@ +from collections import namedtuple + +Offer = namedtuple("Offer", [ + "squeak_hash", + "key_cipher", + "iv", + "amount", + "preimage_hash", + "payment_request", + "node_pubkey", + "node_host", + "node_port", + "proof", + "peer_id", +]) diff --git a/squeakserver/network/peer_client.py b/squeakserver/network/peer_client.py index b38af910..60f556af 100644 --- a/squeakserver/network/peer_client.py +++ b/squeakserver/network/peer_client.py @@ -70,7 +70,8 @@ class PeerClient: challenge=challenge, ) ) - return buy_response.offer + offer_msg = buy_response.offer + return offer_msg def _get_hash(self, squeak): """ Needs to be reversed because hash is stored as little-endian """ diff --git a/squeakserver/node/peer_download.py b/squeakserver/node/peer_download.py index edbf3257..377a8acf 100644 --- a/squeakserver/node/peer_download.py +++ b/squeakserver/node/peer_download.py @@ -73,6 +73,7 @@ class PeerDownload: logger.info("hash to download: {}".format(hash.hex())) # Download squeaks for the hashes + # TODO: catch exception downloading individual squeak for hash in hashes_to_download: if self.stopped(): return diff --git a/squeakserver/node/peer_get_offer.py b/squeakserver/node/peer_get_offer.py index 9c9de458..fcd1325a 100644 --- a/squeakserver/node/peer_get_offer.py +++ b/squeakserver/node/peer_get_offer.py @@ -3,6 +3,7 @@ import threading from squeak.core.encryption import generate_data_key +from squeakserver.core.offer import Offer from squeakserver.server.util import get_hash from squeakserver.network.peer_client import PeerClient @@ -49,6 +50,8 @@ class PeerGetOffer: # Check the proof proof = offer.proof + logger.info("Proof: {}".format(proof.hex())) + logger.info("Expected proof: {}".format(challenge_proof.hex())) if (proof != challenge_proof): raise Exception("Invalid offer proof: {}, expected: {}".format( proof.hex(), @@ -76,7 +79,27 @@ class PeerGetOffer: def _download_buy_offer(self, challenge): logger.info("Downloading buy offer for squeak hash: {}".format(self.squeak_hash.hex())) - return self.peer_client.buy_squeak(self.squeak_hash, challenge) + offer_msg = self.peer_client.buy_squeak(self.squeak_hash, challenge) + offer = self._offer_from_msg(offer_msg) + return offer def _save_offer(self, offer): logger.info("Saving offer: {}".format(offer)) + self.postgres_db.insert_offer(offer) + + def _offer_from_msg(self, offer_msg): + if not offer_msg: + return None + return Offer( + squeak_hash=offer_msg.squeak_hash, + key_cipher=offer_msg.key_cipher, + iv=offer_msg.iv, + amount=offer_msg.amount, + preimage_hash=offer_msg.preimage_hash, + payment_request=offer_msg.payment_request, + node_pubkey=offer_msg.pubkey, + node_host=offer_msg.host, + node_port=offer_msg.port, + proof=offer_msg.proof, + peer_id=self.peer.peer_id, + ) diff --git a/squeakserver/node/peer_upload.py b/squeakserver/node/peer_upload.py index d695747f..82ce6668 100644 --- a/squeakserver/node/peer_upload.py +++ b/squeakserver/node/peer_upload.py @@ -61,6 +61,7 @@ class PeerUpload: logger.debug("Hashes to upload: {}".format(hashes_to_upload)) # Upload squeaks for the hashes + # TODO: catch exception downloading individual squeak for hash in hashes_to_upload: if self.stopped(): return diff --git a/squeakserver/server/postgres_db.py b/squeakserver/server/postgres_db.py index ecfa683e..5354f105 100644 --- a/squeakserver/server/postgres_db.py +++ b/squeakserver/server/postgres_db.py @@ -474,6 +474,34 @@ class PostgresDb: with self.get_cursor() as curs: curs.execute(sql, (peer_id,)) + def insert_offer(self, offer): + """ Insert a new offer. """ + sql = """ + INSERT INTO offer(squeak_hash, key_cipher, iv, amount, preimage_hash, payment_request, node_pubkey, node_host, node_port, peer_id) + VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + RETURNING offer_id; + """ + with self.get_cursor() as curs: + # execute the INSERT statement + curs.execute( + sql, + ( + offer.squeak_hash.hex(), + offer.key_cipher, + offer.iv, + offer.amount, + offer.preimage_hash.hex(), + offer.payment_request, + offer.node_pubkey, + offer.node_host, + offer.node_port, + offer.peer_id, + ), + ) + # get the new offer id back + row = curs.fetchone() + return row["offer_id"] + def _parse_squeak_entry(self, row): if row is None: return None