From 72b475b92a7c3219a4c818f153b5a7c70a2b68c6 Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 25 Oct 2023 20:50:22 -0400 Subject: [PATCH] more auth --- nostr/event.py | 47 ++++++++++++++++++++++++++++++++++++++++++ nostr/message_type.py | 5 ++++- nostr/relay_manager.py | 17 ++++----------- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/nostr/event.py b/nostr/event.py index b903e0e..e52d013 100644 --- a/nostr/event.py +++ b/nostr/event.py @@ -16,6 +16,7 @@ class EventKind(IntEnum): CONTACTS = 3 ENCRYPTED_DIRECT_MESSAGE = 4 DELETE = 5 + CLIENT_AUTHENTICATION = 22242 @dataclass @@ -68,6 +69,14 @@ class Event: """Adds a reference to an event_id as an 'e' tag""" self.tags.append(["e", event_id]) + def add_relay_ref(self, relay_url: str): + """Adds a reference to a relay_url as a 'relay' tag""" + self.tags.append(["relay", relay_url]) + + def add_challenge_ref(self, challenge: str): + """Adds a reference to a challenge as a 'challenge' tag""" + self.tags.append(["challenge", challenge]) + def verify(self) -> bool: pub_key = PublicKey( bytes.fromhex("02" + self.public_key), True @@ -124,3 +133,41 @@ class EncryptedDirectMessage(Event): "EncryptedDirectMessage `id` is undefined until its message is encrypted and stored in the `content` field" ) return super().id + + +@dataclass +class AuthMessage(Event): + relay_url: str = None + challenge: str = None + + def __post_init__(self): + if self.relay_url is None: + raise Exception("Must specify a relay url.") + + if self.challenge is None: + raise Exception("Must specify a challenge.") + + self.kind = EventKind.CLIENT_AUTHENTICATION + super().__post_init__() + + # Must specify the relay url in a 'relay' tag + self.add_relay_ref(self.relay_url) + + # Must specify the challenge in a 'challenge' tag + self.add_challenge_ref(self.challenge) + + def to_message(self) -> str: + return json.dumps( + [ + ClientMessageType.AUTH, + { + "id": self.id, + "pubkey": self.public_key, + "created_at": self.created_at, + "kind": self.kind, + "tags": self.tags, + "content": self.content, + "sig": self.signature, + }, + ] + ) \ No newline at end of file diff --git a/nostr/message_type.py b/nostr/message_type.py index 0ff30e8..82fa92e 100644 --- a/nostr/message_type.py +++ b/nostr/message_type.py @@ -12,6 +12,9 @@ class RelayMessageType: @staticmethod def is_valid(type: str) -> bool: - if type == RelayMessageType.EVENT or type == RelayMessageType.NOTICE or type == RelayMessageType.END_OF_STORED_EVENTS: + if type == RelayMessageType.EVENT or \ + type == RelayMessageType.NOTICE or \ + type == RelayMessageType.END_OF_STORED_EVENTS or \ + type == RelayMessageType.AUTH: return True return False diff --git a/nostr/relay_manager.py b/nostr/relay_manager.py index 48df278..dab0aeb 100644 --- a/nostr/relay_manager.py +++ b/nostr/relay_manager.py @@ -52,13 +52,12 @@ class RelayManager: for relay in self.relays.values(): relay.close() - def publish_message(self, message: str, url:str=None): + def publish_message(self, message: str): for relay in self.relays.values(): if relay.policy.should_write: - if url is None or relay.url == url: - relay.publish(message) + relay.publish(message) - def verify_event(self, event: Event): + def publish_event(self, event: Event): """Verifies that the Event is publishable before submitting it to relays""" if event.signature is None: raise RelayException(f"Could not publish {event.id}: must be signed") @@ -67,12 +66,4 @@ class RelayManager: raise RelayException( f"Could not publish {event.id}: failed to verify signature {event.signature}" ) - - def publish_event(self, event: Event): - self.verify_event(event) - self.publish_message(event.to_message()) - - def publish_auth(self, event: Event, url: str): - self.verify_event(event) - self.publish_message(event.to_message(), url) - + self.publish_message(event.to_message()) \ No newline at end of file