Settings → Plugins: a plugin switched off for the person shows a broken logo #594
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#594
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, by comparing the rows Settings → Plugins lists with the rule the logo view applies, and requesting the logo in a test.Related to #288.
Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now atplugins/views.py:96-100(the check ondecide(name, request.user).on),core/templatetags/postulo.py:251-273(plugin_logo, the<img>branch at :268-270) andplugins/policy.py:279-281(overviewkeeping every row that isoffered);templates/settings/plugins.html:74is where it was.policy.overview()deliberately lists plugins that are off for the person: their own choice, or forced off by an administrator.{% plugin_logo %}draws an<img>for any plugin that ships a logo, butPluginLogoViewanswers 404 to anyone not staff whendecide(name, user).onis false. Exactly those rows get a broken image instead of the initials tile; administrators never see it, because staff skip the check.plugins/views.py:94-99(if not decide(name, request.user).on: raise Http404);core/templatetags/postulo.py:284-305(plugin_logo, the<img>at :300-302 wheneverlogos.logo_for(plugin)is notNone);templates/settings/plugins.html:74;plugins/policy.py:288-290(overviewkeeps every row whose decision isoffered).on == False, the tag rendered<img src="/settings/connections/logo/logoplug/" alt="">, and that URL answered 404 to the same person.decide(...).offeredrather than.on, which is exactly the setoverview()shows to the person; update the view's docstring to match.Done when
tests/test_plugin_logos.pythat switches a logo-declaring plugin off for a non-staff person and assertsconnections:logoanswers 200 for them, and still 404 for a plugin that is unavailable to them.