Skip to content

Commit 751552e

Browse files
committed
Only generate new IDs on failure
1 parent 80e3bac commit 751552e

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

core/database.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,24 @@ async def create_paste(self, *, data: dict[str, Any]) -> PasteModel:
129129
password: str | None = data["password"]
130130

131131
async with self.pool.acquire() as connection:
132-
identifier: str = await utils.generate_id(self)
133-
safety: str = utils.generate_safety_token()
132+
while True:
133+
identifier: str = await utils.generate_id()
134+
safety: str = utils.generate_safety_token()
135+
136+
try:
137+
paster: asyncpg.Record | None = await connection.fetchrow(
138+
paste_query,
139+
identifier,
140+
expiry,
141+
password,
142+
safety,
143+
)
144+
except asyncpg.exceptions.UniqueViolationError:
145+
continue
146+
else:
147+
break
134148

135-
paster: asyncpg.Record | None = await connection.fetchrow(paste_query, identifier, expiry, password, safety)
136-
if not paster:
137-
raise RuntimeError("Unable to create new paste.")
149+
assert paster
138150

139151
paste: PasteModel = PasteModel(paster)
140152
async with connection.transaction():

core/utils.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,18 @@
2323
import json
2424
import re
2525
import secrets
26-
from typing import TYPE_CHECKING, Any
26+
from typing import Any
2727

2828
import starlette_plus
2929

3030
from core import CONFIG
3131

3232

33-
if TYPE_CHECKING:
34-
from .database import Database
35-
36-
3733
TOKEN_REGEX = re.compile(r"[a-zA-Z0-9_-]{23,28}\.[a-zA-Z0-9_-]{6,7}\.[a-zA-Z0-9_-]{27,}")
3834

3935

40-
async def generate_id(database: Database) -> str:
41-
while True:
42-
identifier: str = secrets.token_hex(8)
43-
44-
if not await database.fetch_paste(identifier, password=None):
45-
return identifier
36+
async def generate_id() -> str:
37+
return secrets.token_hex(8)
4638

4739

4840
def generate_safety_token() -> str:

0 commit comments

Comments
 (0)