fix(iam): don't PATCH existing authentik applications — detail endpoint enforces access policy and 404s for akadmin, aborting the loop before all providers got grant_types

This commit is contained in:
Story Crater Bot
2026-07-22 08:09:15 -07:00
parent 3d8a965718
commit be2a56ccf5
+13 -10
View File
@@ -301,14 +301,21 @@ for name, cfg in SERVICES.items():
}, },
) )
# superuser_full_list=true is REQUIRED on the LIST: the applications list
# applies access-policy filtering to the results array (these apps are bound
# to homelab-admins, and the bootstrap-token user akadmin is not a member),
# so without it the GET returns an empty results list even though the app
# exists -> fall through to POST -> 400 "already exists".
#
# We deliberately do NOT patch_existing here: the application DETAIL endpoint
# (PATCH /applications/{pk}/) enforces the same access policy and does NOT
# honor superuser_full_list, so PATCH-by-pk returns 404 for akadmin once the
# homelab-admins binding exists. That 404 aborted the loop before later
# providers got their grant_types. slug/provider/launch_url are set at
# creation and are stable (provider is get_or_create'd by name, stable pk),
# so find-or-create is sufficient.
application = get_or_create( application = get_or_create(
"/api/v3/core/applications/", "/api/v3/core/applications/", "/api/v3/core/applications/", "/api/v3/core/applications/",
# superuser_full_list=true is REQUIRED: the applications list applies
# access-policy filtering to the results array (these apps are bound to
# homelab-admins, and the bootstrap-token user akadmin is not a member),
# so without it the GET returns an empty results list even though the app
# exists -> get_or_create falls through to POST -> 400 "already exists",
# which aborted the whole loop before later providers got grant_types.
f"slug={name}&superuser_full_list=true", f"slug={name}&superuser_full_list=true",
{ {
"name": cfg["display_name"], "name": cfg["display_name"],
@@ -316,10 +323,6 @@ for name, cfg in SERVICES.items():
"provider": provider["pk"], "provider": provider["pk"],
"meta_launch_url": cfg["launch_url"], "meta_launch_url": cfg["launch_url"],
}, },
patch_existing={
"provider": provider["pk"],
"meta_launch_url": cfg["launch_url"],
},
) )
app_pks_for_binding.append((name, application["pk"])) app_pks_for_binding.append((name, application["pk"]))
print(f" {name}: provider pk={provider['pk']} application pk={application['pk']}") print(f" {name}: provider pk={provider['pk']} application pk={application['pk']}")