Skip to content

NexTool 4.2.0 [GLPI 10]

Choose a tag to compare

@RPGMais RPGMais released this 07 Jun 04:14
· 17 commits to glpi-10 since this release

Port assistido — UI e self-update (equalização 4.2.0, paridade GLPI 11)

  • H6 — resiliência do self-update do core: CoreUpdater::applyByCopyAndReload() agora envolve backup + maintenance + cópia + ativação num try/finally com guard if ($backupFilesPath !== null) — falha antes do backup deixa o filesystem intacto (rollback só roda se houver backup) e a limpeza (maintenance flag + opcache) é garantida no finally. Paridade com o GLPI 11 (sem o flag-file fast-path, cuja leitura no boot não foi portada). Requer validação E2E de um self-update real.
  • M8 — feedback de erro na ação de módulo: enable/disable/install que falha (ex.: HTTP 500) passa a exibir glpi_toast_error/alert com a mensagem do servidor, em vez de só recarregar a página em silêncio. Requer validação visual.
  • M11 — preview de screenshot por hover no card de módulo: atributo data-screenshot-url (config.modules.tab) + popover Bootstrap 4 via jQuery (no GLPI 11 é window.bootstrap.Popover); degrada sem erro se jQuery/popover indisponível. Requer validação visual.

Segurança (equalização 4.2.0 — endurecimento do roteador de módulos, paridade GLPI 11)

  • front/modules.php: (1) $action sanitizado por whitelist [a-z0-9_-] antes de compor o filename (LO-08); (2) o 404 não vaza mais o caminho interno ("Recurso não encontrado." em vez do path completo); (3) detecção de arquivo stateless passou de heurística por conteúdo (file_get_contents + grep de DO_NOT_CHECK_LOGIN) para a whitelist canônica plugin_nextool_stateless_files() — só arquivos explicitamente registrados no cache são tratados como stateless.

Corrigido

  • Busca das grades Search::show das abas de módulo renderizava vazia (GLPI 10): o /ajax/search.php genérico não encontrava a classe do módulo (vive em files/_plugins/.../modules/<x>/inc/, fora do autoload do core). Solução central, sem boilerplate por módulo: autoloader em inc/modulespath.inc.php (PluginNextool<Modulo><Classe>modules/<modulo>/inc/<classe>.class.php) + mapeamento reverso tabela→itemtype ($CFG_GLPI['glpiitemtypetables']) para tabelas custom (ex: ..._log) + scan no boot (setup.php) das classes pré-carregadas pelos onInit. Cobre todos os módulos (ativos/inativos) e previne recorrência. Auditoria E2E: 9/9 itemtypes OK.

Modificado

  • Removido o boilerplate redundante de registro de classe searchable nos onInit dos módulos (require_once + getTableForItemType): desnecessário com o autoloader central. Config e hooks mantidos.

Segurança (equalização 4.2.0 — paridade com o GLPI 11)

  • Anti-pirataria só aplica com licença VÁLIDA: LicenseValidator::applyModulesEntitlement() passa a rodar apenas quando a validação é válida (if ($valid && $origin !== 'config_status')). Antes, uma resposta inválida/expirada do administrativo podia desativar módulos PAID indevidamente no GLPI 10. Paridade com o guard já presente no GLPI 11.
  • SSL VERIFY explícito nos clientes HTTP que ainda não setavam (CURLOPT_SSL_VERIFYPEER=true + CURLOPT_SSL_VERIFYHOST=2): FileHelper::performHttpRequest(), CoreUpdateClient (download de pacote) e LicenseValidator::callDistributionLicenseAPI(). Hardening de paridade com o GLPI 11 (audit fase 4b / LO-02).

Corrigido (equalização 4.2.0 — paridade com o GLPI 11)

  • Perfis customizados eram bloqueados na configuração do plugin: front/config.save.php e front/nextoolconfig.form.php exigiam Session::checkRight('config', READ) global, barrando perfis sem o direito config mesmo com permissões granulares do NexTool. Trocado por Session::checkLoginUser(); o controle fino já era feito logo abaixo pelo PermissionManager (gate de view + asserts por ação). Conclui o port do fix 3d01c3e do GLPI 11 (estava pela metade — os overrides canView/canCreate/... já tinham sido portados, faltavam os checkRight).
  • Hero "Plano atual" não aparecia para perfis não-admin: em front/config.form.php o bloco do hero era oculto por $canViewAdminTabs; agora é exibido para qualquer perfil que enxergue a tela, com os botões "Sincronizar" e "Atualização Disponível" ocultados conforme $canManageAdminTabs. Paridade com o GLPI 11.
  • getConfig() ignorava defaults adicionados depois do 1º save (config silenciosamente OFF): PluginNextoolBaseModule::getConfig() retornava só o JSON persistido, sem mesclar getDefaultConfig(). Chaves novas do default ficavam ausentes → tratadas como desligadas (no glpisync, desligava o poll inteiro). Agora faz array_merge(getDefaultConfig(), persistido). Paridade com o GLPI 11 (39f084b).
  • Aba "Logs" (5) faltava na whitelist de forcetab: PluginNextoolMainConfig::getValidTabIds() listava só as abas 1-4; links diretos para a aba de Logs não eram aceitos. Adicionada a aba 5. Paridade com o GLPI 11.
  • Menus de módulos na mesma seção se sobrescreviam (último vencia): setup.php gravava menu_toadd['nextool'][seção] como string única, então dois módulos na mesma seção (ex.: management) perdiam um. Agora acumula em array — o core Html.php do GLPI 10 trata is_array($val) e aceita array de classes por seção. Paridade com o GLPI 11.
  • Dropdown do card de módulo em perfil read-only: branches !canManage e "Plano não validado" não ofereciam "Saiba Mais"/"Changelogs", e o read-only ainda exibia "Configurações" (que cai em erro por exigir canManage). Agora usam appendExternalLinksForCompat. Paridade com o GLPI 11 (3d01c3e).

Adicionado (equalização 4.2.0 — paridade com o GLPI 11)

  • Cache-busting dos assets de módulo (fv): getCssPath()/getJsPath() anexam um carimbo fv por filemtime (md5(versão|mtime)) na URL do asset servido por module_assets.php. O v do GLPI é a versão do plugin (não muda em edição de runtime/hotfix), então browser/proxy/CDN serviam asset velho; o fv muda a cada edição → o deploy chega ao usuário sem hard reload. Novo helper getAssetFv().
  • PluginNextoolValidationException (inc/validationexception.class.php): módulos podem lançar essa exceção em dispatchers pre_item_add/pre_item_update para abortar a criação/atualização de um item GLPI. O HookDispatcher faz rethrow dela (em vez de engolir como erro genérico), permitindo bloquear a operação com mensagem ao usuário. Paridade com o GLPI 11 (ME-09). No GLPI 10 o rethrow foi aplicado a todos os pontos de dispatch (mais abrangente que os 4 genéricos do GLPI 11, dada a estrutura por-itemtype do dispatcher legado).
  • Suporte a instalação via marketplace/ (NEXTOOL_PHP_DIR): todos os require_once/include do plugin (122 ocorrências em 28 arquivos) deixaram de usar GLPI_ROOT . '/plugins/nextool/…' hardcoded e passaram a usar a constante NEXTOOL_PHP_DIR, resolvida em inc/modulespath.inc.php via Plugin::getPhpDir('nextool') (fallback dirname(__DIR__), definida antes do guard de return). O plugin funciona tanto em plugins/ quanto em marketplace/ (instalação via UI), evitando o fatal por path inexistente. Paridade com o GLPI 11 (6ce30d9). Exceção: o require do próprio inc/modulespath.inc.php (que define NEXTOOL_PHP_DIR) usa __DIR__ relativo — nos roteadores pré-boot do GLPI 10 (modules.php, module_assets.php, etc., que rodam antes do includes.php) a constante ainda não existe, então incluí-lo via ela causaria fatal. Em 10 arquivos.

Distribuição / Licenciamento (equalização 4.2.0 — provisionamento resiliente, paridade GLPI 11)

  • Provisionamento HMAC sobrevive ao uninstall (evita 409 na reinstalação): novo context dedicado plugin:nextool_provisioning (PluginNextoolConfig::PROVISIONING_CONTEXT) guarda client_identifier + segredo HMAC e não é apagado no uninstall. getDistributionSettings() lê dele como fonte de verdade (fallback para distribution); helpers getProvisioning/setProvisioning/clearProvisioning; hook.php preserva o context no uninstall e migra o segredo legado (distribution / env_secrets) no install/upgrade. Reinstalar no mesmo domínio reusa o segredo — sem o 409 identifier_already_provisioned. Paridade b42c336.
  • "Regenerar HMAC" não zera mais o segredo antes do bootstrap: evita deixar o cliente sem segredo se o bootstrap falhar (409). O 409 agora exibe mensagem clara (WARNING) orientando o reset do provisionamento pelo administrador — o segredo atual permanece válido.
  • Aceite de Políticas trata 409: quando o ambiente já está provisionado no servidor e o segredo local foi perdido, orienta o reset em vez de "tentar novamente".
  • Ação "Desvincular ambiente" (unlink_environment): limpa o vínculo de provisionamento local (segredo persistido + tabela legacy) para descomissionar ou re-provisionar do zero. Handler pronto.

Etiqueta: nextool[GLPI_10]