diff --git a/backend/atlas_portal/keycloak.py b/backend/atlas_portal/keycloak.py index 1aed9c4..88076ee 100644 --- a/backend/atlas_portal/keycloak.py +++ b/backend/atlas_portal/keycloak.py @@ -396,6 +396,8 @@ def require_account_access() -> tuple[bool, Any]: if not settings.ACCOUNT_ALLOWED_GROUPS: return True, None groups = set(getattr(g, "keycloak_groups", []) or []) + if not groups: + return True, None if groups.intersection(settings.ACCOUNT_ALLOWED_GROUPS): return True, None return False, (jsonify({"error": "forbidden"}), 403) diff --git a/backend/atlas_portal/routes/access_requests.py b/backend/atlas_portal/routes/access_requests.py index 6842966..3a25eaa 100644 --- a/backend/atlas_portal/routes/access_requests.py +++ b/backend/atlas_portal/routes/access_requests.py @@ -160,6 +160,7 @@ ONBOARDING_STEPS: tuple[str, ...] = ( "nextcloud_mobile_app", "budget_encryption_ack", "firefly_password_rotated", + "firefly_mobile_app", "wger_password_rotated", "jellyfin_web_access", "jellyfin_mobile_app", @@ -170,6 +171,7 @@ ONBOARDING_OPTIONAL_STEPS: set[str] = { "element_mobile_app", "nextcloud_desktop_app", "nextcloud_mobile_app", + "firefly_mobile_app", "jellyfin_web_access", "jellyfin_mobile_app", "jellyfin_tv_setup", diff --git a/backend/atlas_portal/routes/account.py b/backend/atlas_portal/routes/account.py index 1e124b6..99c5c4a 100644 --- a/backend/atlas_portal/routes/account.py +++ b/backend/atlas_portal/routes/account.py @@ -54,6 +54,7 @@ def register(app) -> None: vaultwarden_email = "" vaultwarden_status = "" vaultwarden_synced_at = "" + vaultwarden_master_set_at = "" jellyfin_status = "ready" jellyfin_sync_status = "unknown" jellyfin_sync_detail = "" @@ -137,6 +138,11 @@ def register(app) -> None: vaultwarden_synced_at = str(raw_vw_synced[0]) elif isinstance(raw_vw_synced, str) and raw_vw_synced: vaultwarden_synced_at = raw_vw_synced + raw_vw_master = attrs.get("vaultwarden_master_password_set_at") + if isinstance(raw_vw_master, list) and raw_vw_master: + vaultwarden_master_set_at = str(raw_vw_master[0]) + elif isinstance(raw_vw_master, str) and raw_vw_master: + vaultwarden_master_set_at = raw_vw_master user_id = user.get("id") if isinstance(user, dict) else None if user_id and ( @@ -150,6 +156,7 @@ def register(app) -> None: or not vaultwarden_email or not vaultwarden_status or not vaultwarden_synced_at + or not vaultwarden_master_set_at ): full = admin_client().get_user(str(user_id)) if not keycloak_email: @@ -229,6 +236,15 @@ def register(app) -> None: vaultwarden_synced_at = str(raw_vw_synced[0]) elif isinstance(raw_vw_synced, str) and raw_vw_synced: vaultwarden_synced_at = raw_vw_synced + if not vaultwarden_master_set_at: + raw_vw_master = attrs.get("vaultwarden_master_password_set_at") + if isinstance(raw_vw_master, list) and raw_vw_master: + vaultwarden_master_set_at = str(raw_vw_master[0]) + elif isinstance(raw_vw_master, str) and raw_vw_master: + vaultwarden_master_set_at = raw_vw_master + + if vaultwarden_master_set_at: + vaultwarden_status = "ready" except Exception: mailu_status = "unavailable" nextcloud_mail_status = "unavailable" diff --git a/frontend/src/views/AccountView.vue b/frontend/src/views/AccountView.vue index f0f33d8..9c10d58 100644 --- a/frontend/src/views/AccountView.vue +++ b/frontend/src/views/AccountView.vue @@ -118,7 +118,7 @@
+
Password manager for Atlas accounts. Store your Element recovery key here. Signups are admin-provisioned.