fix(portal): persist mailu attributes

This commit is contained in:
Brad Stein 2026-01-03 03:11:52 -03:00
parent 13b0099c29
commit 71678a4819
2 changed files with 15 additions and 7 deletions

View File

@ -155,8 +155,9 @@ class KeycloakAdminClient:
if not isinstance(attrs, dict): if not isinstance(attrs, dict):
attrs = {} attrs = {}
attrs[key] = [value] attrs[key] = [value]
full["attributes"] = attrs # Keycloak rejects PUTs that include read-only fields from the GET payload (400 Bad Request).
self.update_user(user_id, full) # Update only the attributes we intend to change.
self.update_user(user_id, {"attributes": attrs})
def get_group_id(self, group_name: str) -> str | None: def get_group_id(self, group_name: str) -> str | None:
cached = self._group_id_cache.get(group_name) cached = self._group_id_cache.get(group_name)

View File

@ -129,13 +129,20 @@ def provision_access_request(request_code: str) -> ProvisionResult:
try: try:
full = admin_client().get_user(user_id) full = admin_client().get_user(user_id)
attrs = full.get("attributes") or {} attrs = full.get("attributes") or {}
mailu_from_attr: str | None = None
if isinstance(attrs, dict): if isinstance(attrs, dict):
raw_mailu = attrs.get(MAILU_EMAIL_ATTR) raw_mailu = attrs.get(MAILU_EMAIL_ATTR)
if isinstance(raw_mailu, list) and raw_mailu and isinstance(raw_mailu[0], str): if isinstance(raw_mailu, list):
mailu_email = raw_mailu[0] for item in raw_mailu:
elif isinstance(raw_mailu, str) and raw_mailu: if isinstance(item, str) and item.strip():
mailu_email = raw_mailu mailu_from_attr = item.strip()
if not mailu_email: break
elif isinstance(raw_mailu, str) and raw_mailu.strip():
mailu_from_attr = raw_mailu.strip()
if mailu_from_attr:
mailu_email = mailu_from_attr
else:
mailu_email = f"{username}@{settings.MAILU_DOMAIN}" mailu_email = f"{username}@{settings.MAILU_DOMAIN}"
admin_client().set_user_attribute(username, MAILU_EMAIL_ATTR, mailu_email) admin_client().set_user_attribute(username, MAILU_EMAIL_ATTR, mailu_email)
except Exception: except Exception: