Skip to content

Commit 06ba04a

Browse files
committed
fix: Prevent Authorization Bypass Through User-Controlled Key problem (CWE-639)
1 parent 66a1b33 commit 06ba04a

4 files changed

Lines changed: 26 additions & 17 deletions

File tree

‎backend/apps/data_training/api/data_training.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,18 @@ async def create_or_update(session: SessionDep, current_user: CurrentUser, trans
6161
@system_log(
6262
LogConfig(operation_type=OperationType.DELETE, module=OperationModules.DATA_TRAINING, resource_id_expr='id_list'))
6363
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
64-
async def delete(session: SessionDep, id_list: list[int]):
65-
delete_training(session, id_list)
64+
async def delete(session: SessionDep, current_user: CurrentUser, id_list: list[int]):
65+
oid = current_user.oid
66+
delete_training(session, id_list, oid)
6667

6768

6869
@router.get("/{id}/enable/{enabled}", summary=f"{PLACEHOLDER_PREFIX}enable_dt")
6970
@system_log(
7071
LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.DATA_TRAINING, resource_id_expr='id'))
7172
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
72-
async def enable(session: SessionDep, id: int, enabled: bool, trans: Trans):
73-
enable_training(session, id, enabled, trans)
73+
async def enable(session: SessionDep, current_user: CurrentUser, id: int, enabled: bool, trans: Trans):
74+
oid = current_user.oid
75+
enable_training(session, id, enabled, trans, oid)
7476

7577

7678
@router.get("/export", summary=f"{PLACEHOLDER_PREFIX}export_dt")

‎backend/apps/data_training/curd/data_training.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ def update_training(session: SessionDep, info: DataTrainingInfo, oid: int, trans
242242
raise Exception(trans("i18n_data_training.datasource_assistant_cannot_be_none"))
243243

244244
count = session.query(DataTraining).filter(
245+
DataTraining.oid == oid,
245246
DataTraining.id == info.id
246247
).count()
247248
if count == 0:
@@ -420,20 +421,21 @@ def batch_create_training(session: SessionDep, info_list: List[DataTrainingInfo]
420421
}
421422

422423

423-
def delete_training(session: SessionDep, ids: list[int]):
424-
stmt = delete(DataTraining).where(and_(DataTraining.id.in_(ids)))
424+
def delete_training(session: SessionDep, ids: list[int], oid: int):
425+
stmt = delete(DataTraining).where(and_(DataTraining.oid == oid, DataTraining.id.in_(ids)))
425426
session.execute(stmt)
426427
session.commit()
427428

428429

429-
def enable_training(session: SessionDep, id: int, enabled: bool, trans: Trans):
430+
def enable_training(session: SessionDep, id: int, enabled: bool, trans: Trans, oid: int):
430431
count = session.query(DataTraining).filter(
432+
DataTraining.oid == oid,
431433
DataTraining.id == id
432434
).count()
433435
if count == 0:
434436
raise Exception(trans('i18n_data_training.data_training_not_exists'))
435437

436-
stmt = update(DataTraining).where(and_(DataTraining.id == id)).values(
438+
stmt = update(DataTraining).where(and_(DataTraining.oid == oid, DataTraining.id == id)).values(
437439
enabled=enabled,
438440
)
439441
session.execute(stmt)

‎backend/apps/terminology/api/terminology.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,17 @@ async def create_or_update(session: SessionDep, current_user: CurrentUser, trans
5757
@router.delete("", summary=f"{PLACEHOLDER_PREFIX}delete_term")
5858
@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.TERMINOLOGY,resource_id_expr='id_list'))
5959
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
60-
async def delete(session: SessionDep, id_list: list[int]):
61-
delete_terminology(session, id_list)
60+
async def delete(session: SessionDep, current_user: CurrentUser, id_list: list[int]):
61+
oid = current_user.oid
62+
delete_terminology(session, id_list, oid)
6263

6364

6465
@router.get("/{id}/enable/{enabled}", summary=f"{PLACEHOLDER_PREFIX}enable_term")
6566
@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.TERMINOLOGY,resource_id_expr='id'))
6667
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
67-
async def enable(session: SessionDep, id: int, enabled: bool, trans: Trans):
68-
enable_terminology(session, id, enabled, trans)
68+
async def enable(session: SessionDep, current_user: CurrentUser, id: int, enabled: bool, trans: Trans):
69+
oid = current_user.oid
70+
enable_terminology(session, id, enabled, trans, oid)
6971

7072

7173
@router.get("/export", summary=f"{PLACEHOLDER_PREFIX}export_term")

‎backend/apps/terminology/curd/terminology.py‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -716,20 +716,23 @@ def update_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
716716
return info.id
717717

718718

719-
def delete_terminology(session: SessionDep, ids: list[int]):
720-
stmt = delete(Terminology).where(or_(Terminology.id.in_(ids), Terminology.pid.in_(ids)))
719+
def delete_terminology(session: SessionDep, ids: list[int], oid: int):
720+
stmt = delete(Terminology).where(
721+
and_(Terminology.oid == oid, or_(Terminology.id.in_(ids), Terminology.pid.in_(ids))))
721722
session.execute(stmt)
722723
session.commit()
723724

724725

725-
def enable_terminology(session: SessionDep, id: int, enabled: bool, trans: Trans):
726+
def enable_terminology(session: SessionDep, id: int, enabled: bool, trans: Trans, oid: int):
726727
count = session.query(Terminology).filter(
727-
Terminology.id == id
728+
Terminology.id == id,
729+
Terminology.oid == oid,
728730
).count()
729731
if count == 0:
730732
raise Exception(trans('i18n_terminology.terminology_not_exists'))
731733

732-
stmt = update(Terminology).where(or_(Terminology.id == id, Terminology.pid == id)).values(
734+
stmt = update(Terminology).where(
735+
and_(Terminology.oid == oid, or_(Terminology.id == id, Terminology.pid == id))).values(
733736
enabled=enabled,
734737
)
735738
session.execute(stmt)

0 commit comments

Comments
 (0)