FIX - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: СИНХРОНИЗАЦИЯ АВАТАРОВ TASKER

This commit is contained in:
DCCONSTRUCTIONS
2026-05-06 15:30:56 +03:00
parent a5a347e839
commit 3afa15d326
6 changed files with 203 additions and 7 deletions
@@ -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)