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)
|
self.remove_filter(subscription_id)
|
||||||
if self._can_add_filter():
|
if self._can_add_filter():
|
||||||
return [["NOTICE", f"Maximum number of filters ({self.client_config.max_client_filters}) exceeded."]]
|
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)
|
self.filters.append(filter)
|
||||||
events = await get_events(self.relay_id, filter)
|
events = await get_events(self.relay_id, filter)
|
||||||
serialized_events = [
|
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)
|
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]:
|
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))
|
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:
|
if filter.limit and filter.limit > 0:
|
||||||
query += f" LIMIT {filter.limit}"
|
query += f" LIMIT {filter.limit}"
|
||||||
|
|
||||||
return values, query
|
return query, values
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,10 @@ from secp256k1 import PublicKey
|
||||||
|
|
||||||
class ClientConfig(BaseModel):
|
class ClientConfig(BaseModel):
|
||||||
max_client_filters = Field(0, alias="maxClientFilters")
|
max_client_filters = Field(0, alias="maxClientFilters")
|
||||||
|
limit_per_filter = Field(1000, alias="limitPerFilter")
|
||||||
allowed_public_keys = Field([], alias="allowedPublicKeys")
|
allowed_public_keys = Field([], alias="allowedPublicKeys")
|
||||||
blocked_public_keys = Field([], alias="blockedPublicKeys")
|
blocked_public_keys = Field([], alias="blockedPublicKeys")
|
||||||
|
|
||||||
|
|
||||||
def is_author_allowed(self, p: str) -> bool:
|
def is_author_allowed(self, p: str) -> bool:
|
||||||
if p in self.blocked_public_keys:
|
if p in self.blocked_public_keys:
|
||||||
|
|
@ -177,6 +179,10 @@ class NostrFilter(BaseModel):
|
||||||
and (not self.until)
|
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]]:
|
def to_sql_components(self, relay_id: str) -> Tuple[List[str], List[str], List[Any]]:
|
||||||
inner_joins: List[str] = []
|
inner_joins: List[str] = []
|
||||||
where = ["deleted=false", "nostrrelay.events.relay_id = ?"]
|
where = ["deleted=false", "nostrrelay.events.relay_id = ?"]
|
||||||
|
|
|
||||||
|
|
@ -156,6 +156,32 @@
|
||||||
</q-tab-panel>
|
</q-tab-panel>
|
||||||
<q-tab-panel name="config">
|
<q-tab-panel name="config">
|
||||||
<div v-if="relay">
|
<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="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">Max Filters (per client):</div>
|
||||||
<div class="col-3 q-pr-lg">
|
<div class="col-3 q-pr-lg">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue