captcha
This commit is contained in:
@ -6,12 +6,17 @@ from typing import Annotated, Union
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from passlib.context import CryptContext
|
||||
import uuid
|
||||
import random
|
||||
from io import BytesIO
|
||||
from captcha.image import ImageCaptcha
|
||||
|
||||
from ...db import models
|
||||
from . import schemas
|
||||
from ...dependencies import get_db
|
||||
from ...config import jwt_config
|
||||
|
||||
CAPTCHA_SYMBOLS = "abcdefghijklmnopqrstuvwxyz0123456789"
|
||||
|
||||
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
||||
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
||||
|
||||
@ -138,6 +143,42 @@ def get_anon_user(
|
||||
return anon
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_418_IM_A_TEAPOT,
|
||||
detail={"message": "tf dude? trying to spoof your client id?"},
|
||||
)
|
||||
return create_anon_user(db)
|
||||
|
||||
|
||||
def get_captcha(
|
||||
captcha_id: uuid.UUID, db: Annotated[Session, Depends(get_db)]
|
||||
) -> BytesIO:
|
||||
prompt = "".join(random.choice(CAPTCHA_SYMBOLS) for i in range(6))
|
||||
c = models.Captcha(id=captcha_id, prompt=prompt)
|
||||
try:
|
||||
db.add(c)
|
||||
db.commit()
|
||||
except:
|
||||
db.rollback()
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_418_IM_A_TEAPOT,
|
||||
)
|
||||
captcha = ImageCaptcha()
|
||||
data = captcha.generate(prompt)
|
||||
return data
|
||||
|
||||
|
||||
def check_captcha(
|
||||
id: uuid.UUID, prompt: str, db: Annotated[Session, Depends(get_db)]
|
||||
) -> bool:
|
||||
c = (
|
||||
db.query(models.Captcha)
|
||||
.filter(
|
||||
models.Captcha.id == id,
|
||||
models.Captcha.prompt == prompt,
|
||||
models.Captcha.used == False,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
if c:
|
||||
setattr(c, "used", True)
|
||||
db.commit()
|
||||
return True
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user