This commit is contained in:
Timothy Jaeryang Baek 2026-10-08 19:36:27 +04:00
parent eea090805a
commit ce18eca340
4 changed files with 13 additions and 8 deletions

View file

@ -166,13 +166,14 @@ class FolderTable:
self, user_id: str, user_group_ids: set[str], db: Optional[AsyncSession] = None
) -> dict[str, str]:
"""
Returns {folder_id: highest_permission} for all folders shared with user.
Returns {folder_id: highest_permission} for folders shared with or by user.
Checks direct user grants, group grants, and public (user:*) grants.
"""
from open_webui.models.access_grants import AccessGrant
async with get_async_db_context(db) as db:
conditions = [
AccessGrant.resource_id.in_(select(Folder.id).where(Folder.user_id == user_id)),
and_(AccessGrant.principal_type == 'user', AccessGrant.principal_id == '*'),
and_(AccessGrant.principal_type == 'user', AccessGrant.principal_id == user_id),
]

View file

@ -245,15 +245,14 @@ async def get_shared_folders(
user=Depends(get_verified_user),
db: AsyncSession = Depends(get_async_session),
):
"""Get all folders shared with the current user (not owned by them)."""
"""Get folders shared with or by the current user."""
await check_folders_permission(request, user, db=db)
groups = await Groups.get_groups_by_member_id(user.id, db=db, include_inherited=True)
group_ids = {g.id for g in groups}
folder_perms = await Folders.get_shared_folder_ids_for_user(user.id, group_ids, db=db)
folders = await Folders.get_folders_by_ids(list(folder_perms.keys()), db=db)
shared_folders = [folder for folder in folders if folder.user_id != user.id]
shared_folders = await Folders.get_folders_by_ids(list(folder_perms.keys()), db=db)
owners = await Users.get_users_by_user_ids([folder.user_id for folder in shared_folders], db=db)
owner_names = {owner.id: owner.name for owner in owners}
@ -262,7 +261,7 @@ async def get_shared_folders(
{
**folder.model_dump(),
'owner_name': owner_names.get(folder.user_id, 'Unknown'),
'permission': folder_perms[folder.id],
'permission': 'write' if folder.user_id == user.id else folder_perms[folder.id],
}
for folder in shared_folders
]
@ -278,7 +277,7 @@ async def get_shared_folders(
{
**child.model_dump(),
'owner_name': owner_names.get(child.user_id, 'Unknown'),
'permission': folder_perms[folder.id],
'permission': 'write' if child.user_id == user.id else folder_perms[folder.id],
}
)

View file

@ -290,7 +290,10 @@
// Merge shared folders into the same structure
for (const sf of sharedFolders) {
if (folderMap[sf.id]) continue; // Already owned by user
if (folderMap[sf.id]) {
folderMap[sf.id].showOwnerInfo = true;
continue;
}
folderMap[sf.id] = { ...sf, shared: true };
}

View file

@ -959,7 +959,9 @@
lastReadAt={chat.last_read_at}
active={chat.active ?? false}
ownerName={chat.owner_name ?? null}
ownerUserId={folders[folderId]?.shared || chat.user_id !== $user?.id
ownerUserId={folders[folderId]?.showOwnerInfo ||
folders[folderId]?.shared ||
chat.user_id !== $user?.id
? chat.user_id
: null}
readonly={chat.user_id !== $user?.id}