mirror of
https://github.com/yzernik/squeaknode.git
synced 2026-08-13 12:33:25 +02:00
Send secret key when profile configured to free (#1197)
* Set up itest for sending free secret key * Got itest working for download and unlock free squeak * Simplified getting offer or free secret key from controller * Rename get offer method of controller
This commit is contained in:
parent
ad52878499
commit
c9b88ffd4a
6 changed files with 115 additions and 13 deletions
|
|
@ -12,3 +12,4 @@ pytest -s tests
|
|||
#pytest -s tests -k "test_subscribe_squeaks"
|
||||
#pytest -s tests -k "test_download_squeaks_for_address"
|
||||
#pytest -s tests -k "test_make_squeak"
|
||||
#pytest -s tests -k "test_download_free_squeak"
|
||||
|
|
|
|||
|
|
@ -190,3 +190,24 @@ def connected_tcp_peer_id(other_admin_stub):
|
|||
18777,
|
||||
) as peer_id:
|
||||
yield peer_id
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def signing_profile_id_with_free_price(admin_stub, signing_profile_id):
|
||||
# Set the profile to use_custom_price
|
||||
admin_stub.SetSqueakProfileUseCustomPrice(
|
||||
squeak_admin_pb2.SetSqueakProfileUseCustomPriceRequest(
|
||||
profile_id=signing_profile_id,
|
||||
use_custom_price=True,
|
||||
)
|
||||
)
|
||||
try:
|
||||
yield signing_profile_id
|
||||
finally:
|
||||
# Set the profile to use_custom_price
|
||||
admin_stub.SetSqueakProfileUseCustomPrice(
|
||||
squeak_admin_pb2.SetSqueakProfileUseCustomPriceRequest(
|
||||
profile_id=signing_profile_id,
|
||||
use_custom_price=False,
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -710,6 +710,30 @@ def test_buy_squeak(
|
|||
assert get_payment_summary_response.payment_summary.amount_spent_msat > 0
|
||||
|
||||
|
||||
def test_download_free_squeak(
|
||||
admin_stub,
|
||||
other_admin_stub,
|
||||
connected_tcp_peer_id,
|
||||
lightning_client,
|
||||
signing_profile_id_with_free_price,
|
||||
saved_squeak_hash,
|
||||
):
|
||||
# Download squeak
|
||||
download_squeak(other_admin_stub, saved_squeak_hash)
|
||||
time.sleep(5)
|
||||
|
||||
# Download offer
|
||||
download_offers(other_admin_stub, saved_squeak_hash)
|
||||
time.sleep(5)
|
||||
|
||||
# Get the squeak display item
|
||||
get_squeak_display_entry = get_squeak_display(
|
||||
other_admin_stub, saved_squeak_hash)
|
||||
assert (
|
||||
get_squeak_display_entry.content_str == "Hello from the profile on the server!"
|
||||
)
|
||||
|
||||
|
||||
def test_download_single_squeak(
|
||||
admin_stub,
|
||||
other_admin_stub,
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ from squeak.messages import msg_inv
|
|||
from squeak.messages import msg_notfound
|
||||
from squeak.messages import msg_offer
|
||||
from squeak.messages import msg_pong
|
||||
from squeak.messages import msg_secretkey
|
||||
from squeak.messages import msg_squeak
|
||||
from squeak.net import CInv
|
||||
|
||||
|
|
@ -204,15 +205,46 @@ class PeerMessageHandler:
|
|||
if squeak is not None:
|
||||
return msg_squeak(squeak=squeak)
|
||||
if inv.type == 2:
|
||||
offer = self.squeak_controller.get_buy_offer(
|
||||
squeak_hash=inv.hash,
|
||||
peer_address=self.peer.remote_address,
|
||||
offer_or_secret_key = self.squeak_controller.get_offer_or_secret_key(
|
||||
inv.hash,
|
||||
self.peer.remote_address,
|
||||
)
|
||||
if offer is not None:
|
||||
if offer_or_secret_key is None:
|
||||
return None
|
||||
elif type(offer_or_secret_key) is bytes:
|
||||
return msg_secretkey(
|
||||
hashSqk=inv.hash,
|
||||
secretKey=offer_or_secret_key,
|
||||
)
|
||||
elif type(offer_or_secret_key) is Offer:
|
||||
return msg_offer(
|
||||
hashSqk=inv.hash,
|
||||
nonce=offer.nonce,
|
||||
strPaymentInfo=offer.payment_request.encode('utf-8'),
|
||||
host=offer.host.encode('utf-8'),
|
||||
port=offer.port,
|
||||
nonce=offer_or_secret_key.nonce,
|
||||
strPaymentInfo=offer_or_secret_key.payment_request.encode(
|
||||
'utf-8'),
|
||||
host=offer_or_secret_key.host.encode('utf-8'),
|
||||
port=offer_or_secret_key.port,
|
||||
)
|
||||
|
||||
# price = self.squeak_controller.get_price_for_squeak(inv.hash)
|
||||
# if price == 0:
|
||||
# secret_key = self.squeak_controller.get_squeak_secret_key(
|
||||
# inv.hash)
|
||||
# if secret_key is not None:
|
||||
# return msg_secretkey(
|
||||
# hashSqk=inv.hash,
|
||||
# secretKey=secret_key,
|
||||
# )
|
||||
# else:
|
||||
# offer = self.squeak_controller.get_buy_offer(
|
||||
# squeak_hash=inv.hash,
|
||||
# peer_address=self.peer.remote_address,
|
||||
# )
|
||||
# if offer is not None:
|
||||
# return msg_offer(
|
||||
# hashSqk=inv.hash,
|
||||
# nonce=offer.nonce,
|
||||
# strPaymentInfo=offer.payment_request.encode('utf-8'),
|
||||
# host=offer.host.encode('utf-8'),
|
||||
# port=offer.port,
|
||||
# )
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ import logging
|
|||
import threading
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
from typing import Union
|
||||
|
||||
import sqlalchemy
|
||||
import squeak.params
|
||||
|
|
@ -162,9 +163,21 @@ class SqueakController:
|
|||
def get_temporary_interest_counter(self, squeak: CSqueak) -> Optional[TemporaryInterest]:
|
||||
return self.temporary_interest_manager.lookup_counter(squeak)
|
||||
|
||||
def get_buy_offer(self, squeak_hash: bytes, peer_address: PeerAddress) -> Optional[Offer]:
|
||||
# Check if there is an existing offer for the hash/peer_address combination
|
||||
sent_offer = self.get_saved_sent_offer(squeak_hash, peer_address)
|
||||
def get_offer_or_secret_key(self, squeak_hash: bytes, peer_address: PeerAddress) -> Optional[Union[bytes, Offer]]:
|
||||
squeak = self.get_squeak(squeak_hash)
|
||||
if squeak is None:
|
||||
return None
|
||||
price = self.get_price_for_squeak(squeak)
|
||||
if price == 0:
|
||||
return self.get_squeak_secret_key(squeak_hash)
|
||||
else:
|
||||
return self.get_offer(
|
||||
squeak_hash=squeak_hash,
|
||||
peer_address=peer_address,
|
||||
)
|
||||
|
||||
def get_offer(self, squeak_hash: bytes, peer_address: PeerAddress) -> Optional[Offer]:
|
||||
sent_offer = self.get_sent_offer_for_peer(squeak_hash, peer_address)
|
||||
if sent_offer is None:
|
||||
return None
|
||||
return self.squeak_core.package_offer(
|
||||
|
|
@ -173,7 +186,7 @@ class SqueakController:
|
|||
self.config.lnd.port,
|
||||
)
|
||||
|
||||
def get_saved_sent_offer(self, squeak_hash: bytes, peer_address: PeerAddress) -> Optional[SentOffer]:
|
||||
def get_sent_offer_for_peer(self, squeak_hash: bytes, peer_address: PeerAddress) -> Optional[SentOffer]:
|
||||
# Check if there is an existing offer for the hash/peer_address combination
|
||||
sent_offer = self.squeak_db.get_sent_offer_by_squeak_hash_and_peer(
|
||||
squeak_hash,
|
||||
|
|
@ -194,6 +207,17 @@ class SqueakController:
|
|||
self.squeak_db.insert_sent_offer(sent_offer)
|
||||
return sent_offer
|
||||
|
||||
def get_price_for_squeak(self, squeak: CSqueak) -> int:
|
||||
squeak_address = str(squeak.GetAddress())
|
||||
logger.info(
|
||||
"Looking for profile with address: {}".format(squeak_address))
|
||||
squeak_profile = self.get_squeak_profile_by_address(squeak_address)
|
||||
logger.info(
|
||||
"Checking price for squeak with profile: {}".format(squeak_profile))
|
||||
if squeak_profile is not None and squeak_profile.use_custom_price:
|
||||
return squeak_profile.custom_price_msat
|
||||
return self.config.node.price_msat
|
||||
|
||||
def create_signing_profile(self, profile_name: str) -> int:
|
||||
if len(profile_name) == 0:
|
||||
raise Exception(
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ def test_nothing():
|
|||
|
||||
|
||||
def test_get_buy_offer(squeak_controller):
|
||||
assert squeak_controller.get_buy_offer is not None
|
||||
assert squeak_controller.get_offer is not None
|
||||
|
||||
|
||||
def test_get_network_default(squeak_controller):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue