1
0

add expiration tag to psbt nostr event and pass ssl context to relay manager

This commit is contained in:
f321x
2025-04-02 14:16:56 +02:00
parent ff3e70d743
commit b8d10df2dc

View File

@@ -24,7 +24,8 @@
# SOFTWARE. # SOFTWARE.
import asyncio import asyncio
import time import time
from typing import TYPE_CHECKING, Union, List, Tuple, Dict from contextlib import asynccontextmanager
from typing import TYPE_CHECKING, Union, List, Tuple, Dict, Optional
import ssl import ssl
import json import json
@@ -44,8 +45,7 @@ from electrum.i18n import _
from electrum.wallet import Multisig_Wallet, Abstract_Wallet from electrum.wallet import Multisig_Wallet, Abstract_Wallet
from electrum.logging import Logger from electrum.logging import Logger
from electrum.network import Network from electrum.network import Network
from electrum.util import log_exceptions, OldTaskGroup, UserCancelled from electrum.util import log_exceptions, OldTaskGroup, UserCancelled, ca_path
from electrum.gui.qt.transaction_dialog import show_transaction, TxDialog from electrum.gui.qt.transaction_dialog import show_transaction, TxDialog
from electrum.gui.qt.util import WaitingDialog from electrum.gui.qt.util import WaitingDialog
@@ -53,8 +53,8 @@ if TYPE_CHECKING:
from electrum.gui.qt import ElectrumGui from electrum.gui.qt import ElectrumGui
from electrum.gui.qt.main_window import ElectrumWindow from electrum.gui.qt.main_window import ElectrumWindow
# event kind used for nostr messages (with expiration tag)
NOSTR_DM = 4 NOSTR_EVENT_KIND = 4
now = lambda: int(time.time()) now = lambda: int(time.time())
@@ -126,6 +126,7 @@ class CosignerWallet(Logger):
self.logger.info(f'deleting old event {k}') self.logger.info(f'deleting old event {k}')
self.known_events.pop(k) self.known_events.pop(k)
self.relays = self.config.NOSTR_RELAYS.split(',') self.relays = self.config.NOSTR_RELAYS.split(',')
self.ssl_context = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=ca_path)
self.logger.info(f'relays {self.relays}') self.logger.info(f'relays {self.relays}')
self.obj = QReceiveSignalObject() self.obj = QReceiveSignalObject()
self.obj.cosigner_receive_signal.connect(self.on_receive) self.obj.cosigner_receive_signal.connect(self.on_receive)
@@ -163,23 +164,45 @@ class CosignerWallet(Logger):
async def stop(self): async def stop(self):
await self.taskgroup.cancel_remaining() await self.taskgroup.cancel_remaining()
@asynccontextmanager
async def nostr_manager(self):
manager_logger = self.logger.getChild('aionostr')
manager_logger.setLevel("INFO") # set to INFO because DEBUG is very spammy
async with aionostr.Manager(
relays=self.relays,
private_key=self.nostr_privkey,
ssl_context=self.ssl_context,
# todo: add proxy support, first needs:
# https://github.com/spesmilo/electrum-aionostr/pull/8
proxy=None,
log=manager_logger
) as manager:
yield manager
@log_exceptions @log_exceptions
async def send_direct_messages(self, messages): async def send_direct_messages(self, messages: List[Tuple[str, str]]):
for pubkey, msg in messages: our_private_key: PrivateKey = aionostr.key.PrivateKey(bytes.fromhex(self.nostr_privkey))
eid = await aionostr.add_event( async with self.nostr_manager() as manager:
self.relays, for pubkey, msg in messages:
kind=NOSTR_DM, encrypted_msg: str = our_private_key.encrypt_message(msg, pubkey)
content=msg, eid = await aionostr._add_event(
direct_message=pubkey, manager,
private_key=self.nostr_privkey) kind=NOSTR_EVENT_KIND,
self.logger.info(f'message sent to {pubkey}: {eid}') content=encrypted_msg,
private_key=self.nostr_privkey,
tags=[['p', pubkey], ['expiration', str(int(now() + self.KEEP_DELAY))]])
self.logger.info(f'message sent to {pubkey}: {eid}')
@log_exceptions @log_exceptions
async def check_direct_messages(self): async def check_direct_messages(self):
privkey = PrivateKey(bytes.fromhex(self.nostr_privkey)) privkey = PrivateKey(bytes.fromhex(self.nostr_privkey))
async with aionostr.Manager(self.relays, private_key=self.nostr_privkey) as manager: async with self.nostr_manager() as manager:
await manager.connect() query = {
query = {"kinds": [NOSTR_DM], "limit":100, "#p": [self.nostr_pubkey]} "kinds": [NOSTR_EVENT_KIND],
"limit":100,
"#p": [self.nostr_pubkey],
"since": int(now() - self.KEEP_DELAY)
}
async for event in manager.get_events(query, single_event=False, only_stored=False): async for event in manager.get_events(query, single_event=False, only_stored=False):
if event.id in self.known_events: if event.id in self.known_events:
self.logger.info(f'known event {event.id} {util.age(event.created_at)}') self.logger.info(f'known event {event.id} {util.age(event.created_at)}')
@@ -258,7 +281,7 @@ class CosignerWallet(Logger):
self.window.show_error(str(e)) self.window.show_error(str(e))
return return
self.window.show_message( self.window.show_message(
_("Your transaction was sent to your cosigners via Nostr DM.") + '\n\n' + tx.txid()) _("Your transaction was sent to your cosigners via Nostr.") + '\n\n' + tx.txid())
def on_receive(self, pubkey, event_id, tx): def on_receive(self, pubkey, event_id, tx):