Skip to content

Commit 36ca9a0

Browse files
committed
[DOP-29537] Adjust Swagger schema for OAuth2GatewayProvider
1 parent 5c57819 commit 36ca9a0

File tree

8 files changed

+65
-45
lines changed

8 files changed

+65
-45
lines changed

syncmaster/server/api/v1/auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ async def auth_callback(
6363
)
6464
async def logout(
6565
request: Request,
66-
current_user: Annotated[User, Depends(get_user(is_active=True))],
66+
current_user: Annotated[User, Depends(get_user())],
6767
auth_provider: Annotated[KeycloakAuthProvider, Depends(Stub(AuthProvider))],
6868
):
6969
refresh_token = request.session.get("refresh_token", None)

syncmaster/server/api/v1/connections.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ async def read_connections(
3939
page: int = Query(gt=0, default=1),
4040
page_size: int = Query(gt=0, le=50, default=20), # noqa: WPS432
4141
type: list[ConnectionType] | None = Query(None),
42-
current_user: User = Depends(get_user(is_active=True)),
42+
current_user: User = Depends(get_user()),
4343
unit_of_work: UnitOfWork = Depends(UnitOfWork),
4444
search_query: str | None = Query(
4545
None,
@@ -102,7 +102,7 @@ async def read_connections(
102102
@router.post("/connections")
103103
async def create_connection(
104104
connection_data: CreateConnectionSchema,
105-
current_user: User = Depends(get_user(is_active=True)),
105+
current_user: User = Depends(get_user()),
106106
unit_of_work: UnitOfWork = Depends(UnitOfWork),
107107
) -> ReadConnectionSchema:
108108
"""Create new connection"""
@@ -144,15 +144,15 @@ async def create_connection(
144144
)
145145

146146

147-
@router.get("/connections/known_types", dependencies=[Depends(get_user(is_active=True))])
147+
@router.get("/connections/known_types", dependencies=[Depends(get_user())])
148148
async def read_connection_types() -> list[str]:
149149
return CONNECTION_TYPES
150150

151151

152152
@router.get("/connections/{connection_id}")
153153
async def read_connection(
154154
connection_id: int,
155-
current_user: User = Depends(get_user(is_active=True)),
155+
current_user: User = Depends(get_user()),
156156
unit_of_work: UnitOfWork = Depends(UnitOfWork),
157157
) -> ReadConnectionSchema:
158158
resource_role = await unit_of_work.connection.get_resource_permission(
@@ -186,7 +186,7 @@ async def read_connection(
186186
async def update_connection( # noqa: WPS217, WPS238
187187
connection_id: int,
188188
connection_data: UpdateConnectionSchema,
189-
current_user: User = Depends(get_user(is_active=True)),
189+
current_user: User = Depends(get_user()),
190190
unit_of_work: UnitOfWork = Depends(UnitOfWork),
191191
) -> ReadConnectionSchema:
192192
resource_role = await unit_of_work.connection.get_resource_permission(
@@ -246,7 +246,7 @@ async def update_connection( # noqa: WPS217, WPS238
246246
@router.delete("/connections/{connection_id}", status_code=NO_CONTENT)
247247
async def delete_connection(
248248
connection_id: int,
249-
current_user: User = Depends(get_user(is_active=True)),
249+
current_user: User = Depends(get_user()),
250250
unit_of_work: UnitOfWork = Depends(UnitOfWork),
251251
):
252252
resource_role = await unit_of_work.connection.get_resource_permission(
@@ -274,7 +274,7 @@ async def delete_connection(
274274
async def copy_connection( # noqa: WPS238
275275
connection_id: int,
276276
copy_connection_data: ConnectionCopySchema,
277-
current_user: User = Depends(get_user(is_active=True)),
277+
current_user: User = Depends(get_user()),
278278
unit_of_work: UnitOfWork = Depends(UnitOfWork),
279279
) -> ReadConnectionSchema:
280280
resource_role = await unit_of_work.connection.get_resource_permission(

syncmaster/server/api/v1/groups.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async def read_groups(
3030
page: int = Query(gt=0, default=1),
3131
page_size: int = Query(gt=0, le=50, default=20), # noqa: WPS432
3232
role: str | None = Query(default=None),
33-
current_user: User = Depends(get_user(is_active=True)),
33+
current_user: User = Depends(get_user()),
3434
unit_of_work: UnitOfWork = Depends(UnitOfWork),
3535
search_query: str | None = Query(
3636
None,
@@ -59,7 +59,7 @@ async def read_groups(
5959
async def create_group(
6060
group_data: CreateGroupSchema,
6161
unit_of_work: UnitOfWork = Depends(UnitOfWork),
62-
current_user: User = Depends(get_user(is_active=True)),
62+
current_user: User = Depends(get_user()),
6363
) -> ReadGroupSchema:
6464
async with unit_of_work:
6565
group = await unit_of_work.group.create(
@@ -73,7 +73,7 @@ async def create_group(
7373
@router.get("/groups/{group_id}")
7474
async def read_group(
7575
group_id: int,
76-
current_user: User = Depends(get_user(is_active=True)),
76+
current_user: User = Depends(get_user()),
7777
unit_of_work: UnitOfWork = Depends(UnitOfWork),
7878
) -> GroupWithUserRoleSchema:
7979
resource_role = await unit_of_work.group.get_group_permission(
@@ -96,7 +96,7 @@ async def read_group(
9696
async def update_group( # noqa: WPS217
9797
group_id: int,
9898
group_data: UpdateGroupSchema,
99-
current_user: User = Depends(get_user(is_active=True)),
99+
current_user: User = Depends(get_user()),
100100
unit_of_work: UnitOfWork = Depends(UnitOfWork),
101101
) -> ReadGroupSchema:
102102
resource_rule = await unit_of_work.group.get_group_permission(
@@ -154,7 +154,7 @@ async def read_group_users(
154154
group_id: int,
155155
page: int = Query(gt=0, default=1),
156156
page_size: int = Query(gt=0, le=50, default=20), # noqa: WPS432
157-
current_user: User = Depends(get_user(is_active=True)),
157+
current_user: User = Depends(get_user()),
158158
unit_of_work: UnitOfWork = Depends(UnitOfWork),
159159
) -> UserPageSchemaAsGroupMember:
160160
resource_role = await unit_of_work.group.get_group_permission(
@@ -178,7 +178,7 @@ async def update_user_role_group(
178178
group_id: int,
179179
user_id: int,
180180
update_user_data: AddUserSchema,
181-
current_user: User = Depends(get_user(is_active=True)),
181+
current_user: User = Depends(get_user()),
182182
unit_of_work: UnitOfWork = Depends(UnitOfWork),
183183
) -> AddUserSchema:
184184
resource_rule = await unit_of_work.group.get_group_permission(
@@ -207,7 +207,7 @@ async def add_user_to_group(
207207
group_id: int,
208208
user_id: int,
209209
add_user_data: AddUserSchema,
210-
current_user: User = Depends(get_user(is_active=True)),
210+
current_user: User = Depends(get_user()),
211211
unit_of_work: UnitOfWork = Depends(UnitOfWork),
212212
):
213213
resource_rule = await unit_of_work.group.get_group_permission(
@@ -237,7 +237,7 @@ async def add_user_to_group(
237237
async def delete_user_from_group(
238238
group_id: int,
239239
user_id: int,
240-
current_user: User = Depends(get_user(is_active=True)),
240+
current_user: User = Depends(get_user()),
241241
unit_of_work: UnitOfWork = Depends(UnitOfWork),
242242
):
243243
resource_rule = await unit_of_work.group.get_group_permission(

syncmaster/server/api/v1/queue.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ async def read_queues(
2727
group_id: int,
2828
page: int = Query(gt=0, default=1),
2929
page_size: int = Query(gt=0, le=50, default=20), # noqa: WPS432
30-
current_user: User = Depends(get_user(is_active=True)),
30+
current_user: User = Depends(get_user()),
3131
unit_of_work: UnitOfWork = Depends(UnitOfWork),
3232
search_query: str | None = Query(
3333
None,
@@ -55,7 +55,7 @@ async def read_queues(
5555
@router.get("/queues/{queue_id}", description="Read queue by id")
5656
async def read_queue(
5757
queue_id: int,
58-
current_user: User = Depends(get_user(is_active=True)),
58+
current_user: User = Depends(get_user()),
5959
unit_of_work: UnitOfWork = Depends(UnitOfWork),
6060
) -> ReadQueueSchema:
6161
resource_role = await unit_of_work.queue.get_resource_permission(
@@ -75,7 +75,7 @@ async def read_queue(
7575
@router.post("/queues", description="Create new queue")
7676
async def create_queue(
7777
queue_data: CreateQueueSchema,
78-
current_user: User = Depends(get_user(is_active=True)),
78+
current_user: User = Depends(get_user()),
7979
unit_of_work: UnitOfWork = Depends(UnitOfWork),
8080
) -> ReadQueueSchema:
8181
group_permission = await unit_of_work.queue.get_group_permission(
@@ -98,7 +98,7 @@ async def create_queue(
9898
async def update_queue(
9999
queue_id: int,
100100
queue_data: UpdateQueueSchema,
101-
current_user: User = Depends(get_user(is_active=True)),
101+
current_user: User = Depends(get_user()),
102102
unit_of_work: UnitOfWork = Depends(UnitOfWork),
103103
) -> ReadQueueSchema:
104104
resource_role = await unit_of_work.queue.get_resource_permission(
@@ -123,7 +123,7 @@ async def update_queue(
123123
@router.delete("/queues/{queue_id}", description="Delete queue by id", status_code=NO_CONTENT)
124124
async def delete_queue(
125125
queue_id: int,
126-
current_user: User = Depends(get_user(is_active=True)),
126+
current_user: User = Depends(get_user()),
127127
unit_of_work: UnitOfWork = Depends(UnitOfWork),
128128
):
129129
resource_role = await unit_of_work.queue.get_resource_permission(

syncmaster/server/api/v1/runs.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ async def read_runs(
3636
status: list[Status] | None = Query(default=None),
3737
started_at_since: datetime | None = Query(default=None),
3838
started_at_until: datetime | None = Query(default=None),
39-
current_user: User = Depends(get_user(is_active=True)),
39+
current_user: User = Depends(get_user()),
4040
) -> RunPageSchema:
4141
"""Return runs of transfer with pagination"""
4242
resource_rule = await unit_of_work.transfer.get_resource_permission(
@@ -63,7 +63,7 @@ async def read_runs(
6363
async def read_run(
6464
run_id: int,
6565
unit_of_work: UnitOfWork = Depends(UnitOfWork),
66-
current_user: User = Depends(get_user(is_active=True)),
66+
current_user: User = Depends(get_user()),
6767
) -> ReadRunSchema:
6868
run = await unit_of_work.run.read_by_id(run_id=run_id)
6969

@@ -83,7 +83,7 @@ async def start_run( # noqa: WPS217
8383
create_run_data: CreateRunSchema,
8484
celery: Annotated[Celery, Depends(Stub(Celery))],
8585
unit_of_work: UnitOfWork = Depends(UnitOfWork),
86-
current_user: User = Depends(get_user(is_active=True)),
86+
current_user: User = Depends(get_user()),
8787
) -> ReadRunSchema:
8888
# Check: user can start transfer
8989
resource_rule = await unit_of_work.transfer.get_resource_permission(
@@ -139,7 +139,7 @@ async def start_run( # noqa: WPS217
139139
async def stop_run(
140140
run_id: int,
141141
unit_of_work: UnitOfWork = Depends(UnitOfWork),
142-
current_user: User = Depends(get_user(is_active=True)),
142+
current_user: User = Depends(get_user()),
143143
) -> ReadRunSchema:
144144
run = await unit_of_work.run.read_by_id(run_id=run_id)
145145

syncmaster/server/api/v1/transfers.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ async def read_transfers(
4545
source_connection_type: list[ConnectionType] | None = Query(None),
4646
target_connection_type: list[ConnectionType] | None = Query(None),
4747
is_scheduled: bool | None = Query(None),
48-
current_user: User = Depends(get_user(is_active=True)),
48+
current_user: User = Depends(get_user()),
4949
unit_of_work: UnitOfWork = Depends(UnitOfWork),
5050
) -> TransferPageSchema:
5151
"""Return transfers in page format"""
@@ -79,7 +79,7 @@ async def read_transfers(
7979
@router.post("/transfers")
8080
async def create_transfer( # noqa: WPS217, WPS238
8181
transfer_data: CreateTransferSchema,
82-
current_user: User = Depends(get_user(is_active=True)),
82+
current_user: User = Depends(get_user()),
8383
unit_of_work: UnitOfWork = Depends(UnitOfWork),
8484
) -> ReadTransferSchema:
8585
group_permission = await unit_of_work.transfer.get_group_permission(
@@ -139,7 +139,7 @@ async def create_transfer( # noqa: WPS217, WPS238
139139
@router.get("/transfers/{transfer_id}")
140140
async def read_transfer(
141141
transfer_id: int,
142-
current_user: User = Depends(get_user(is_active=True)),
142+
current_user: User = Depends(get_user()),
143143
unit_of_work: UnitOfWork = Depends(UnitOfWork),
144144
) -> ReadTransferSchema:
145145
"""Return transfer data by transfer ID"""
@@ -159,7 +159,7 @@ async def read_transfer(
159159
async def copy_transfer( # noqa: WPS217, WPS238
160160
transfer_id: int,
161161
transfer_data: CopyTransferSchema,
162-
current_user: User = Depends(get_user(is_active=True)),
162+
current_user: User = Depends(get_user()),
163163
unit_of_work: UnitOfWork = Depends(UnitOfWork),
164164
) -> ReadTransferSchema:
165165
resource_role = await unit_of_work.transfer.get_resource_permission(
@@ -239,7 +239,7 @@ async def copy_transfer( # noqa: WPS217, WPS238
239239
async def update_transfer( # noqa: WPS217, WPS238
240240
transfer_id: int,
241241
transfer_data: CreateTransferSchema,
242-
current_user: User = Depends(get_user(is_active=True)),
242+
current_user: User = Depends(get_user()),
243243
unit_of_work: UnitOfWork = Depends(UnitOfWork),
244244
) -> ReadTransferSchema:
245245
# Check: user can update transfer
@@ -318,7 +318,7 @@ async def update_transfer( # noqa: WPS217, WPS238
318318
@router.delete("/transfers/{transfer_id}", status_code=NO_CONTENT)
319319
async def delete_transfer(
320320
transfer_id: int,
321-
current_user: User = Depends(get_user(is_active=True)),
321+
current_user: User = Depends(get_user()),
322322
unit_of_work: UnitOfWork = Depends(UnitOfWork),
323323
):
324324
resource_role = await unit_of_work.transfer.get_resource_permission(

syncmaster/server/api/v1/users.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
async def get_users(
2121
page: int = Query(gt=0, default=1),
2222
page_size: int = Query(gt=0, le=50, default=20), # noqa: WPS432
23-
current_user: User = Depends(get_user(is_active=True)),
23+
current_user: User = Depends(get_user()),
2424
unit_of_work: UnitOfWork = Depends(UnitOfWork),
2525
search_query: str | None = Query(
2626
None,
@@ -39,15 +39,15 @@ async def get_users(
3939

4040
@router.get("/users/me")
4141
async def read_current_user(
42-
current_user: User = Depends(get_user(is_active=True)),
42+
current_user: User = Depends(get_user()),
4343
) -> ReadUserSchema:
4444
return ReadUserSchema.model_validate(current_user, from_attributes=True)
4545

4646

47-
@router.get("/users/{user_id}", dependencies=[Depends(get_user(is_active=True))])
47+
@router.get("/users/{user_id}", dependencies=[Depends(get_user())])
4848
async def read_user(
4949
user_id: int,
5050
unit_of_work: UnitOfWork = Depends(UnitOfWork),
5151
) -> ReadUserSchema:
52-
user = await unit_of_work.user.read_by_id(user_id=user_id, is_active=True)
52+
user = await unit_of_work.user.read_by_id(user_id=user_id)
5353
return ReadUserSchema.model_validate(user, from_attributes=True)

syncmaster/server/services/get_user.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,55 @@
44
from typing import Annotated, Any
55

66
from fastapi import Depends, Request
7-
from fastapi.security import OAuth2PasswordBearer
7+
from fastapi.security import (
8+
HTTPAuthorizationCredentials,
9+
HTTPBearer,
10+
OAuth2PasswordBearer,
11+
)
812

913
from syncmaster.db.models import User
1014
from syncmaster.exceptions import ActionNotAllowedError, EntityNotFoundError
1115
from syncmaster.server.dependencies import Stub
1216
from syncmaster.server.providers.auth import AuthProvider
1317

14-
oauth_schema = OAuth2PasswordBearer(tokenUrl="v1/auth/token", auto_error=False)
18+
bearer_token = HTTPBearer(
19+
description="Perform authentication using Bearer token",
20+
auto_error=False,
21+
)
22+
oauth_schema = OAuth2PasswordBearer(
23+
description="Perform authentication using configured AuthProvider",
24+
tokenUrl="v1/auth/token",
25+
auto_error=False,
26+
)
1527

1628

17-
def get_user(
18-
is_active: bool = False,
29+
def get_user( # noqa: WPS231
1930
is_superuser: bool = False,
20-
) -> Callable[[Request, AuthProvider, str], Coroutine[Any, Any, User]]:
31+
) -> Callable[[Request, AuthProvider, str | None, HTTPAuthorizationCredentials | None], Coroutine[Any, Any, User]]:
2132
async def wrapper(
2233
request: Request,
2334
auth_provider: Annotated[AuthProvider, Depends(Stub(AuthProvider))],
24-
access_token: Annotated[str | None, Depends(oauth_schema)],
35+
oauth_token: Annotated[str | None, Depends(oauth_schema)],
36+
bearer_token: Annotated[HTTPAuthorizationCredentials | None, Depends(bearer_token)],
2537
) -> User:
26-
# keycloak provider patches session and store access_token in cookie,
27-
# when dummy auth stores it in "Authorization" header
28-
access_token = request.session.get("access_token", "") or access_token
38+
access_token: str | None = None
39+
if bearer_token:
40+
# explicit token provided by user
41+
access_token = bearer_token.credentials
42+
elif oauth_token:
43+
# DummyAuth stores token in "Authorization" header
44+
access_token = oauth_token
45+
elif "access_token" in request.session:
46+
# KeyaockAuth patches session and store access_token in cookie
47+
access_token = request.session["access_token"]
48+
2949
user = await auth_provider.get_current_user(
3050
access_token=access_token,
3151
request=request,
3252
)
3353
if user is None:
3454
raise EntityNotFoundError("User not found")
35-
if is_active and not user.is_active:
55+
if not user.is_active:
3656
raise ActionNotAllowedError("Inactive user")
3757
if is_superuser and not user.is_superuser:
3858
raise ActionNotAllowedError("You have no power here")

0 commit comments

Comments
 (0)