more auth

This commit is contained in:
vic
2023-10-25 20:50:22 -04:00
parent 7e8b9a6591
commit 72b475b92a
3 changed files with 55 additions and 14 deletions

View File

@@ -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,
},
]
)

View File

@@ -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

View File

@@ -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)