feat: enforce query limit on relay side
This commit is contained in:
parent
b4094ad2f5
commit
bddab70677
4 changed files with 36 additions and 3 deletions
|
|
@ -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 = [
|
||||
|
|
|
|||
4
crud.py
4
crud.py
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 = ?"]
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue