FIX - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: СИНХРОНИЗАЦИЯ АВАТАРОВ TASKER
This commit is contained in:
@@ -4,6 +4,7 @@ import logging
|
||||
import os
|
||||
import secrets
|
||||
from urllib.parse import urlencode
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import jwt
|
||||
import requests
|
||||
@@ -363,7 +364,7 @@ def get_or_create_oidc_user(email, claims):
|
||||
display_name = first_string_claim(claims, "name", "preferred_username") or User.get_display_name(email)
|
||||
given_name = first_string_claim(claims, "given_name") or ""
|
||||
family_name = first_string_claim(claims, "family_name") or ""
|
||||
avatar_url = first_string_claim(claims, "picture", "avatar_url", "avatar") or ""
|
||||
avatar_url = normalize_nodedc_avatar_url(first_string_claim(claims, "picture", "avatar_url", "avatar") or "")
|
||||
|
||||
user = User.objects.create_user(
|
||||
email=email,
|
||||
@@ -437,7 +438,7 @@ def sync_user_profile_from_claims(user, claims):
|
||||
display_name = first_string_claim(claims, "name", "preferred_username")
|
||||
given_name = first_string_claim(claims, "given_name")
|
||||
family_name = first_string_claim(claims, "family_name")
|
||||
avatar_url = first_string_claim(claims, "picture", "avatar_url", "avatar")
|
||||
avatar_url = normalize_nodedc_avatar_url(first_string_claim(claims, "picture", "avatar_url", "avatar"))
|
||||
|
||||
if display_name and user.display_name != display_name:
|
||||
user.display_name = display_name
|
||||
@@ -463,6 +464,45 @@ def sync_user_profile_from_claims(user, claims):
|
||||
return updated_fields
|
||||
|
||||
|
||||
def normalize_nodedc_avatar_url(value):
|
||||
if not isinstance(value, str):
|
||||
return ""
|
||||
|
||||
avatar_url = value.strip()
|
||||
if not avatar_url:
|
||||
return ""
|
||||
|
||||
if avatar_url.startswith(("http://", "https://", "data:")):
|
||||
return avatar_url
|
||||
|
||||
if avatar_url.startswith(("/storage/", "/uploads/")):
|
||||
launcher_origin = resolve_nodedc_launcher_origin()
|
||||
return f"{launcher_origin}{avatar_url}" if launcher_origin else avatar_url
|
||||
|
||||
return avatar_url
|
||||
|
||||
|
||||
def resolve_nodedc_launcher_origin():
|
||||
explicit_origin = os.environ.get("PLANE_NODEDC_LAUNCHER_PUBLIC_URL", "").strip()
|
||||
if explicit_origin:
|
||||
return explicit_origin.rstrip("/")
|
||||
|
||||
for env_key in [
|
||||
"PLANE_NODEDC_HANDOFF_URL",
|
||||
"PLANE_NODEDC_ACCESS_CHECK_URL",
|
||||
"PLANE_NODEDC_ACCESS_DENIED_REDIRECT_URL",
|
||||
"PLANE_NODEDC_GLOBAL_LOGOUT_URL",
|
||||
]:
|
||||
configured_url = os.environ.get(env_key, "").strip()
|
||||
if not configured_url:
|
||||
continue
|
||||
parsed_url = urlparse(configured_url)
|
||||
if parsed_url.scheme and parsed_url.netloc:
|
||||
return f"{parsed_url.scheme}://{parsed_url.netloc}"
|
||||
|
||||
return ""
|
||||
|
||||
|
||||
def first_string_claim(claims, *keys):
|
||||
for key in keys:
|
||||
value = claims.get(key)
|
||||
|
||||
Reference in New Issue
Block a user