Skip to content

Fix: provider de privacidade compatível com a interface; logs via get_string() - #12

Merged
robertosilvino merged 2 commits into
mainfrom
fix-privacy-logs
Sep 30, 2026
Merged

robertosilvino merged 2 commits into
mainfrom
fix-privacy-logs

Conversation

@robertosilvino

@robertosilvino robertosilvino commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Duas correções independentes.

1. Provider de privacidade: erro fatal ao carregar

null_provider declara get_reason(): string no Moodle 3.8 e no 4.5. O provider declarava get_reason() sem tipo de retorno, e carregar a classe dava erro fatal:

Declaration of local_resourcelinkfix\privacy\provider::get_reason() must be compatible with core_privacy\local\metadata\null_provider::get_reason(): string

Reproduzido no 3.8 (PHP 7.4) e no 4.5 (PHP 8.3). Qualquer caminho que carregue o provider (registro de privacidade, pedidos de dados) morre.

A main também atende o Moodle 3.0 (PHP 5.6), que não aceita : string. A correção usa o trait do próprio core, \core_privacy\local\legacy_polyfill: o plugin escreve _get_reason() e o trait fornece o get_reason(): string. O trait existe no 3.8 e no 4.5 e não está marcado como obsoleto. No 3.0, sem Privacy API, a classe nunca é carregada.

2. Mensagens de log literais passam a vir de get_string()

As duas mensagens que ainda eram texto fixo no restore agora vêm do pacote de idioma, com tradução em pt_br:

chave mensagem (en)
errorrewritefailed local_resourcelinkfix: failed to rewrite {file} (cmid {cmid}): {error}
logtruncated local_resourcelinkfix [{label}] ... truncated at {limit} of {size} bytes

O texto em inglês no log não muda, e o nível também não (WARNING e ERROR).

Testes

  • privacy_provider_test: carrega o provider e confere a razão (pulado sem Privacy API, ou seja, no 3.0).
  • log_messages_test: as duas mensagens vêm do pacote de idioma. Como o texto em inglês é igual ao literal antigo, comparar texto não distingue get_string() de literal. O teste troca o gerenciador de strings ($CFG->customstringmanager) por um que marca cada string devolvida. Numa cópia com literal idêntico, os três casos que esperam a mensagem ficaram vermelhos. O limite de 8192 bytes é testado em 0, 1, 8191, 8192, 8193 e 20000.

Medido localmente no Moodle 3.8 (PHP 7.4, mysqli): vermelho antes da correção; depois, OK (94 tests, 329 assertions). php -l sem erros no PHP 5.6 nos sete arquivos. O 3.0 e o phpcs ficam por conta deste CI.

version.php: 2026092901.

Depois do merge

Os testes novos usam setUp()/tearDown() sem : void e o data provider sem : array, como exige a main (PHPUnit 4.8). Na cascata para MOODLE_401_STABLE e MOODLE_405_STABLE eles ganham os ajustes do PHPUnit 9, como nos PRs #8 e #9.

Depois da revisão

  • phpcs: phpcs:disable PSR2.Methods.MethodDeclaration.Underscore só em volta de _get_reason(), nome que o legacy_polyfill do core impõe. O polyfill fica igual em todas as branches, inclusive nas 4.x, para o arquivo não divergir.
  • Fixtures com uma classe por arquivo; MOODLE_INTERNAL removido do teste de privacidade.
  • log_messages_test compara com o texto literal que o log tinha, dentro dos marcadores: prova a origem (get_string()) e o texto. Antes, a comparação usava o próprio get_string() e aceitaria qualquer mudança de texto.
  • Teste novo: en e pt_br têm as mesmas chaves e os mesmos placeholders.
  • O tearDown restaura o string manager anterior, em vez de apagá-lo.
  • O cabeçalho dos pedaços de conteúdo no log ([BEFORE 1/3]) continua literal: ele marca os dados despejados, não é frase. O docblock do teste passa a dizer isso.
  • Limitação declarada: não há teste de ponta a ponta do PCRE abortando até chegar ao log. Provocar o aborto real também derruba as expressões regulares do próprio Moodle (ver pcre_limits_test). O teste usa um dublê que lança a mesma exceção.
  • Local, no Moodle 3.8: OK (95 tests, 370 assertions).

🤖 Generated with Claude Code

…_string()

- privacy/provider: get_reason() sem ": string" era erro fatal ao carregar
  a classe no Moodle 3.8 e no 4.5. Passa a usar core_privacy legacy_polyfill
  (_get_reason()), que continua válido no PHP 5.6 do Moodle 3.0.
- restore: as mensagens "failed to rewrite" e "truncated at" saem de
  get_string() (errorrewritefailed, logtruncated), com tradução em pt_br.
  O texto em inglês no log não muda.
- Testes: provider carregável; mensagens vindas do pacote de idioma, com a
  fronteira do limite de 8192 bytes.
- Versão 2026092901.
- provider: phpcs:disable PSR2.Methods.MethodDeclaration.Underscore em
  volta de _get_reason(), nome imposto pelo legacy_polyfill do core.
- fixtures dos testes de log: uma classe por arquivo.
- privacy_provider_test: sem MOODLE_INTERNAL (arquivo sem efeito colateral).
- log_messages_test: compara com o texto literal que o log tinha, não com
  o próprio get_string(); o tearDown restaura o string manager anterior;
  teste novo confere que en e pt_br têm as mesmas chaves e placeholders;
  docblock deixa de afirmar que todo texto do log vem do pacote de idioma
  (o cabeçalho dos pedaços de conteúdo continua literal).
@robertosilvino
robertosilvino merged commit 0617527 into main Sep 30, 2026
14 checks passed
robertosilvino added a commit that referenced this pull request Sep 30, 2026
robertosilvino added a commit that referenced this pull request Sep 30, 2026
Cascata (Moodle 4.5): #11 e #12, pela 401 (#13)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant