feat: enforce query limit on relay side

This commit is contained in:
Vlad Stan 2023-02-08 18:15:43 +02:00
parent b4094ad2f5
commit bddab70677
4 changed files with 36 additions and 3 deletions

View file

@ -200,7 +200,8 @@ class NostrClientConnection:
self.remove_filter(subscription_id)
if self._can_add_filter():
return [["NOTICE", f"Maximum number of filters ({self.client_config.max_client_filters}) exceeded."]]
filter.enforce_limit(self.client_config.limit_per_filter)
self.filters.append(filter)
events = await get_events(self.relay_id, filter)
serialized_events = [

View file

@ -96,7 +96,7 @@ async def create_event(relay_id: str, e: NostrEvent):
await create_event_tags(relay_id, e.id, name, value, extra)
async def get_events(relay_id: str, filter: NostrFilter, include_tags = True) -> List[NostrEvent]:
values, query = build_select_events_query(relay_id, filter)
query, values = build_select_events_query(relay_id, filter)
rows = await db.fetchall(query, tuple(values))
@ -191,4 +191,4 @@ def build_select_events_query(relay_id:str, filter:NostrFilter):
if filter.limit and filter.limit > 0:
query += f" LIMIT {filter.limit}"
return values, query
return query, values

View file

@ -10,8 +10,10 @@ from secp256k1 import PublicKey
class ClientConfig(BaseModel):
max_client_filters = Field(0, alias="maxClientFilters")
limit_per_filter = Field(1000, alias="limitPerFilter")
allowed_public_keys = Field([], alias="allowedPublicKeys")
blocked_public_keys = Field([], alias="blockedPublicKeys")
def is_author_allowed(self, p: str) -> bool:
if p in self.blocked_public_keys:
@ -177,6 +179,10 @@ class NostrFilter(BaseModel):
and (not self.until)
)
def enforce_limit(self, limit: int):
if not self.limit or self.limit > limit:
self.limit = limit
def to_sql_components(self, relay_id: str) -> Tuple[List[str], List[str], List[Any]]:
inner_joins: List[str] = []
where = ["deleted=false", "nostrrelay.events.relay_id = ?"]

View file

@ -156,6 +156,32 @@
</q-tab-panel>
<q-tab-panel name="config">
<div v-if="relay">
<div class="row items-center no-wrap q-mb-md">
<div class="col-3 q-pr-lg">Limit per filter:</div>
<div class="col-3 q-pr-lg">
<q-input
filled
dense
v-model.trim="relay.config.limitPerFilter"
type="number"
min="0"
></q-input>
</div>
<div class="col-6">
<q-badge
v-if="relay.config.limitPerFilter == 0"
color="green"
class="float-left"
><span>No Limit</span>
</q-badge>
<q-badge v-else color="yellow" text-color="black" class="float-left"
><span
>Maximum number of events to be returned in the initial query
(default 1000)</span
>
</q-badge>
</div>
</div>
<div class="row items-center no-wrap q-mb-md">
<div class="col-3 q-pr-lg">Max Filters (per client):</div>
<div class="col-3 q-pr-lg">