NexTool 4.2.0 [GLPI 10]
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 numtry/finallycom guardif ($backupFilesPath !== null)— falha antes do backup deixa o filesystem intacto (rollback só roda se houver backup) e a limpeza (maintenance flag + opcache) é garantida nofinally. 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)$actionsanitizado 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 deDO_NOT_CHECK_LOGIN) para a whitelist canônicaplugin_nextool_stateless_files()— só arquivos explicitamente registrados no cache são tratados como stateless.
Corrigido
- Busca das grades
Search::showdas abas de módulo renderizava vazia (GLPI 10): o/ajax/search.phpgenérico não encontrava a classe do módulo (vive emfiles/_plugins/.../modules/<x>/inc/, fora do autoload do core). Solução central, sem boilerplate por módulo: autoloader eminc/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 pelosonInit. 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
onInitdos 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) eLicenseValidator::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.phpefront/nextoolconfig.form.phpexigiamSession::checkRight('config', READ)global, barrando perfis sem o direitoconfigmesmo com permissões granulares do NexTool. Trocado porSession::checkLoginUser(); o controle fino já era feito logo abaixo peloPermissionManager(gate de view + asserts por ação). Conclui o port do fix3d01c3edo GLPI 11 (estava pela metade — os overridescanView/canCreate/...já tinham sido portados, faltavam oscheckRight). - Hero "Plano atual" não aparecia para perfis não-admin: em
front/config.form.phpo 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 mesclargetDefaultConfig(). Chaves novas do default ficavam ausentes → tratadas como desligadas (no glpisync, desligava o poll inteiro). Agora fazarray_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.phpgravavamenu_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 coreHtml.phpdo GLPI 10 tratais_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
!canManagee "Plano não validado" não ofereciam "Saiba Mais"/"Changelogs", e o read-only ainda exibia "Configurações" (que cai em erro por exigircanManage). Agora usamappendExternalLinksForCompat. 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 carimbofvporfilemtime(md5(versão|mtime)) na URL do asset servido pormodule_assets.php. Ovdo GLPI é a versão do plugin (não muda em edição de runtime/hotfix), então browser/proxy/CDN serviam asset velho; ofvmuda a cada edição → o deploy chega ao usuário sem hard reload. Novo helpergetAssetFv(). PluginNextoolValidationException(inc/validationexception.class.php): módulos podem lançar essa exceção em dispatcherspre_item_add/pre_item_updatepara abortar a criação/atualização de um item GLPI. OHookDispatcherfaz 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 osrequire_once/includedo plugin (122 ocorrências em 28 arquivos) deixaram de usarGLPI_ROOT . '/plugins/nextool/…'hardcoded e passaram a usar a constanteNEXTOOL_PHP_DIR, resolvida eminc/modulespath.inc.phpviaPlugin::getPhpDir('nextool')(fallbackdirname(__DIR__), definida antes do guard dereturn). O plugin funciona tanto emplugins/quanto emmarketplace/(instalação via UI), evitando o fatal por path inexistente. Paridade com o GLPI 11 (6ce30d9). Exceção: orequiredo próprioinc/modulespath.inc.php(que defineNEXTOOL_PHP_DIR) usa__DIR__relativo — nos roteadores pré-boot do GLPI 10 (modules.php,module_assets.php, etc., que rodam antes doincludes.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) guardaclient_identifier+ segredo HMAC e não é apagado no uninstall.getDistributionSettings()lê dele como fonte de verdade (fallback paradistribution); helpersgetProvisioning/setProvisioning/clearProvisioning;hook.phppreserva 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 409identifier_already_provisioned. Paridadeb42c336. - "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]