Skip to content

Commit eb53281

Browse files
tjbckClassic298
andcommitted
refac
Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com>
1 parent a285a39 commit eb53281

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

backend/open_webui/models/users.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ async def insert_new_user(
279279
oauth: dict | None = None,
280280
db: AsyncSession | None = None,
281281
) -> UserModel | None:
282+
try:
283+
profile_image_url = validate_profile_image_url(profile_image_url)
284+
except ValueError:
285+
profile_image_url = '/user.png'
286+
282287
async with get_async_db_context(db) as session:
283288
user = UserModel(
284289
**{
@@ -606,6 +611,11 @@ async def update_user_profile_image_url_by_id(
606611
profile_image_url: str,
607612
db: AsyncSession | None = None,
608613
) -> UserModel | None:
614+
try:
615+
profile_image_url = validate_profile_image_url(profile_image_url)
616+
except ValueError:
617+
profile_image_url = '/user.png'
618+
609619
async with get_async_db_context(db) as session:
610620
user = await session.get(User, id)
611621
if user is None:

backend/open_webui/utils/oauth.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import hashlib
55
import json
66
import logging
7-
import mimetypes
87
import re
98
import sys
109
import time
@@ -85,6 +84,7 @@
8584
from open_webui.utils.auth import create_token, get_password_hash
8685
from open_webui.utils.groups import apply_default_group_assignment
8786
from open_webui.utils.misc import parse_duration
87+
from open_webui.utils.validate import validate_profile_image_url
8888
from starlette.responses import RedirectResponse
8989

9090

@@ -1648,12 +1648,17 @@ async def _process_picture_url(self, picture_url: str, access_token: str = None)
16481648
allow_redirects=AIOHTTP_CLIENT_ALLOW_REDIRECTS,
16491649
) as resp:
16501650
if resp.ok:
1651+
upstream_mime = (resp.headers.get('Content-Type', '') or '').split(';', 1)[0].strip().lower()
16511652
picture = await resp.read()
16521653
base64_encoded_picture = base64.b64encode(picture).decode('utf-8')
1653-
guessed_mime_type = mimetypes.guess_type(picture_url)[0]
1654-
if guessed_mime_type is None:
1655-
guessed_mime_type = 'image/jpeg'
1656-
return f'data:{guessed_mime_type};base64,{base64_encoded_picture}'
1654+
try:
1655+
return validate_profile_image_url(f'data:{upstream_mime};base64,{base64_encoded_picture}')
1656+
except ValueError:
1657+
log.warning(
1658+
f'Rejected OAuth profile picture from {picture_url}: '
1659+
f'MIME {upstream_mime!r} is not allowed'
1660+
)
1661+
return '/user.png'
16571662
else:
16581663
log.warning(f'Failed to fetch profile picture from {picture_url}')
16591664
return '/user.png'

0 commit comments

Comments
 (0)