KB-PLUGIN-044: gotcha do right custom (relogin) e gate por right nativo (padrao butterfly) - incidente mindscrum 1.0.0/1.0.1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Gemini 2026-07-13 19:07:42 -03:00
parent 2001dbfc0c
commit 0c6d70c1c9

View file

@ -98,6 +98,22 @@ e são testáveis em CLI.
Teste E2E que prova: sessão com `ticket => READ` (sem READALL) deve ver só os Teste E2E que prova: sessão com `ticket => READ` (sem READALL) deve ver só os
chamados onde é ator; sessão com rights zerados deve ter toda mutação negada. chamados onde é ator; sessão com rights zerados deve ter toda mutação negada.
## Right CUSTOM exige relogin de TODOS — gate por right NATIVO evita (padrão butterfly)
Incidente em produção (mindscrum 1.0.0): right custom (`plugin_mindscrum_board`)
gravado em `glpi_profilerights` no install, mas o GLPI carrega rights na sessão
**no LOGIN** — o menu apareceu SÓ para quem instalou; todos os outros usuários
(inclusive super-admins) precisariam de logout/login. Sintoma: "o plugin só
aparece para quem instalou".
Solução (1.0.1, replicando o butterfly): **gate por right NATIVO** já presente
em toda sessão — `Board::$rightname = 'ticket'` (menu/leitura = `ticket READ`;
edição = `ticket UPDATE`) + guardas por item (`canUpdateItem` etc.). Sem classe
Profile, sem `change_profile`, sem relogin. Regra prática: só crie right custom
se o plugin precisa de permissão que NENHUM right nativo representa — e aceite o
custo do relogin pós-install; para ferramentas sobre itens nativos (board de
tickets/projetos), o right nativo do item é o gate certo.
## Bônus — XSS de atributo em JS de plugin ## Bônus — XSS de atributo em JS de plugin
`div.textContent = s; return div.innerHTML` escapa `& < >` mas **não aspas** `div.textContent = s; return div.innerHTML` escapa `& < >` mas **não aspas**