mirror of
https://github.com/aljazceru/python-nostr.git
synced 2025-12-19 15:24:19 +01:00
more auth
This commit is contained in:
@@ -16,6 +16,7 @@ class EventKind(IntEnum):
|
|||||||
CONTACTS = 3
|
CONTACTS = 3
|
||||||
ENCRYPTED_DIRECT_MESSAGE = 4
|
ENCRYPTED_DIRECT_MESSAGE = 4
|
||||||
DELETE = 5
|
DELETE = 5
|
||||||
|
CLIENT_AUTHENTICATION = 22242
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -68,6 +69,14 @@ class Event:
|
|||||||
"""Adds a reference to an event_id as an 'e' tag"""
|
"""Adds a reference to an event_id as an 'e' tag"""
|
||||||
self.tags.append(["e", event_id])
|
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:
|
def verify(self) -> bool:
|
||||||
pub_key = PublicKey(
|
pub_key = PublicKey(
|
||||||
bytes.fromhex("02" + self.public_key), True
|
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"
|
"EncryptedDirectMessage `id` is undefined until its message is encrypted and stored in the `content` field"
|
||||||
)
|
)
|
||||||
return super().id
|
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
|
@staticmethod
|
||||||
def is_valid(type: str) -> bool:
|
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 True
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -52,13 +52,12 @@ class RelayManager:
|
|||||||
for relay in self.relays.values():
|
for relay in self.relays.values():
|
||||||
relay.close()
|
relay.close()
|
||||||
|
|
||||||
def publish_message(self, message: str, url:str=None):
|
def publish_message(self, message: str):
|
||||||
for relay in self.relays.values():
|
for relay in self.relays.values():
|
||||||
if relay.policy.should_write:
|
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"""
|
"""Verifies that the Event is publishable before submitting it to relays"""
|
||||||
if event.signature is None:
|
if event.signature is None:
|
||||||
raise RelayException(f"Could not publish {event.id}: must be signed")
|
raise RelayException(f"Could not publish {event.id}: must be signed")
|
||||||
@@ -67,12 +66,4 @@ class RelayManager:
|
|||||||
raise RelayException(
|
raise RelayException(
|
||||||
f"Could not publish {event.id}: failed to verify signature {event.signature}"
|
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())
|
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)
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user