mirror of
https://github.com/aljazceru/python-nostr.git
synced 2025-12-18 23:04:20 +01:00
more auth
This commit is contained in:
@@ -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,
|
||||
},
|
||||
]
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user