diff --git a/client_manager.py b/client_manager.py index 84f39ca..2b4843e 100644 --- a/client_manager.py +++ b/client_manager.py @@ -142,6 +142,10 @@ class NostrClientConnection: return False def _is_direct_message_for_other(self, event: NostrEvent) -> bool: + """ + Direct messages are not inteded to be boradcast (even if encrypted). + If the server requires AUTH for kind '4' then direct message will be sent only to the intended client. + """ if not event.is_direct_message: return False if not self.client_config.event_requires_auth(event.kind): @@ -208,7 +212,7 @@ class NostrClientConnection: await delete_events( self.relay_id, NostrFilter(kinds=[e.kind], authors=[e.pubkey]) ) - await create_event(self.relay_id, e) + await create_event(self.relay_id, e, self.pubkey) await self._broadcast_event(e) if e.is_delete_event: @@ -257,6 +261,7 @@ class NostrClientConnection: filter.enforce_limit(self.client_config.limit_per_filter) self.filters.append(filter) events = await get_events(self.relay_id, filter) + events = [e for e in events if not self._is_direct_message_for_other(e)] serialized_events = [ event.serialize_response(subscription_id) for event in events ] @@ -290,7 +295,7 @@ class NostrClientConnection: return False, "error: NIP42 tags are missing for auth event" if self.client_config.domain != extract_domain(relay_tag[0]): - return False, "error: wrong relay domain for auth event" + return False, "error: wrong relay domain for auth event" if self._auth_challenge != challenge_tag[0]: return False, "error: wrong chanlange value for auth event" @@ -302,7 +307,8 @@ class NostrClientConnection: if not valid: return (valid, message) - valid, message = await self._validate_storage(e.pubkey, e.size_bytes) + publisher_pubkey = self.pubkey if self.pubkey else e.pubkey + valid, message = await self._validate_storage(publisher_pubkey, e.size_bytes) if not valid: return (valid, message) diff --git a/crud.py b/crud.py index d6aad4c..746010e 100644 --- a/crud.py +++ b/crud.py @@ -132,11 +132,13 @@ async def delete_relay(user_id: str, relay_id: str): ########################## EVENTS #################### -async def create_event(relay_id: str, e: NostrEvent): +async def create_event(relay_id: str, e: NostrEvent, publisher: Optional[str]): + publisher = publisher if publisher else e.pubkey await db.execute( """ INSERT INTO nostrrelay.events ( relay_id, + publisher, id, pubkey, created_at, @@ -145,10 +147,11 @@ async def create_event(relay_id: str, e: NostrEvent): sig, size ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( relay_id, + publisher, e.id, e.pubkey, e.created_at, @@ -199,14 +202,14 @@ async def get_event(relay_id: str, id: str) -> Optional[NostrEvent]: return event -async def get_storage_for_public_key(relay_id: str, pubkey: str) -> int: +async def get_storage_for_public_key(relay_id: str, publisher_pubkey: str) -> int: """Returns the storage space in bytes for all the events of a public key. Deleted events are also counted""" row = await db.fetchone( - "SELECT SUM(size) as sum FROM nostrrelay.events WHERE relay_id = ? AND pubkey = ? GROUP BY pubkey", + "SELECT SUM(size) as sum FROM nostrrelay.events WHERE relay_id = ? AND publisher = ? GROUP BY publisher", ( relay_id, - pubkey, + publisher_pubkey, ), ) if not row: diff --git a/migrations.py b/migrations.py index 6b81a94..c76b22a 100644 --- a/migrations.py +++ b/migrations.py @@ -23,6 +23,7 @@ async def m001_initial(db): CREATE TABLE nostrrelay.events ( relay_id TEXT NOT NULL, deleted BOOLEAN DEFAULT false, + publisher TEXT NOT NULL, id TEXT NOT NULL, pubkey TEXT NOT NULL, created_at {db.big_int} NOT NULL,