Skip to content

Commit c70d833

Browse files
BombinBMTemmmmmo
andauthored
Добавил проверку на наличие скоупа print.file.send (#88)
В коде добавил опциональность для ввода номера билета, а так же проверку на наличие скоупа внутри имеющихся у юзера. в выводе оставил только имя юзера. --------- Co-authored-by: Morozov Artem <126605382+Temmmmmo@users.noreply.github.com>
1 parent 9b1ff25 commit c70d833

2 files changed

Lines changed: 28 additions & 11 deletions

File tree

print_service/routes/file.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import aiofiles
66
import aiofiles.os
7+
from auth_lib.fastapi import UnionAuth
78
from fastapi import APIRouter, File, UploadFile
89
from fastapi.exceptions import HTTPException
910
from fastapi.params import Depends
@@ -59,11 +60,13 @@ def validate_pages(cls, value: str):
5960

6061

6162
class SendInput(BaseModel):
62-
surname: str = Field(
63+
surname: str | None = Field(
64+
default=None,
6365
description='Фамилия',
6466
example='Иванов',
6567
)
66-
number: str = Field(
68+
number: str | None = Field(
69+
default=None,
6770
description='Номер профсоюзного или студенческого билетов',
6871
example='1015000',
6972
)
@@ -107,22 +110,35 @@ class ReceiveOutput(BaseModel):
107110
},
108111
response_model=SendOutput,
109112
)
110-
async def send(inp: SendInput, settings: Settings = Depends(get_settings)):
113+
async def send(
114+
inp: SendInput,
115+
user_auth=Depends(UnionAuth(allow_none=True)),
116+
settings: Settings = Depends(get_settings),
117+
):
111118
"""Получить пин код для загрузки и скачивания файла.
112119
113120
Полученный пин-код можно использовать в методах POST и GET `/file/{pin}`.
114121
"""
115122
user = db.session.query(UnionMember)
116123
if not settings.ALLOW_STUDENT_NUMBER:
117124
user = user.filter(UnionMember.union_number != None)
118-
user = user.filter(
119-
or_(
120-
func.upper(UnionMember.student_number) == inp.number.upper(),
121-
func.upper(UnionMember.union_number) == inp.number.upper(),
122-
),
123-
func.upper(UnionMember.surname) == inp.surname.upper(),
124-
).one_or_none()
125-
if not user:
125+
126+
if (inp.number is not None) and (inp.surname is not None):
127+
user = user.filter(
128+
or_(
129+
func.upper(UnionMember.student_number) == inp.number.upper(),
130+
func.upper(UnionMember.union_number) == inp.number.upper(),
131+
),
132+
func.upper(UnionMember.surname) == inp.surname.upper(),
133+
)
134+
135+
else:
136+
if not "print.file.send" in [scope["name"] for scope in user_auth.get('session_scopes')]:
137+
raise NotInUnion()
138+
139+
user = user.one_or_none()
140+
141+
if user is None:
126142
raise NotInUnion()
127143
try:
128144
pin = generate_pin(db.session)

print_service/routes/user.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ async def check_union_member(
5050
v: Optional[str] = __version__,
5151
):
5252
"""Проверяет наличие пользователя в списке."""
53+
5354
surname = surname.upper()
5455
user = db.session.query(UnionMember)
5556
if not settings.ALLOW_STUDENT_NUMBER:

0 commit comments

Comments
 (0)