Coverage for open_webui/utils/access_control/folders.py: 35%

18 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 05:07 +0000

1from open_webui.models.access_grants import AccessGrants 

2from open_webui.models.folders import FolderModel, Folders 

3from sqlalchemy.ext.asyncio import AsyncSession 

4 

5 

6async def has_folder_access(user_id: str, folder: FolderModel, permission: str, db: AsyncSession | None) -> bool: 

7 """Check if user has access to folder directly or via ancestor inheritance.""" 

8 # A corrupt parent loop must not spin forever 

9 seen_ids = set() 

10 while folder and folder.id not in seen_ids: 

11 seen_ids.add(folder.id) 

12 

13 if folder.user_id == user_id: 

14 return True 

15 

16 if await AccessGrants.has_access( 

17 user_id=user_id, 

18 resource_type='folder', 

19 resource_id=folder.id, 

20 permission=permission, 

21 db=db, 

22 ): 

23 return True 

24 

25 folder = await Folders.get_folder_by_id(folder.parent_id, db=db) if folder.parent_id else None 

26 return False 

27 

28 

29async def has_folder_write_access(user_id: str, folder_id: str, db: AsyncSession | None = None) -> bool: 

30 """Check write access on the folder with this id; False if no such folder exists.""" 

31 folder = await Folders.get_folder_by_id(folder_id, db=db) 

32 if not folder: 32 ↛ 34line 32 didn't jump to line 34 because the condition on line 32 was always true

33 return False 

34 return await has_folder_access(user_id, folder, 'write', db)