WordPress.org Plugin Directory — Audit Report
Data da auditoria: 2026-05-11 Versao auditada: JEO 3.6.5 Plugin: JEO WP (jeo/jeo.php) Baseado nas diretrizes oficiais: https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/
Resumo Executivo
| Categoria | Status | Acoes Requeridas |
|---|---|---|
| Licenca | ALERTA | Texto da licenca e GPL v3, mas header declara GPL-2.0+ |
| readme.txt | FALHA | Faltam Tags (0/1-12), Requires PHP desatualizado |
| Seguranca — Input/Output | FALHA | CSS injection via loaders.php; AJAX sem capability check |
| Seguranca — REST/AJAX | PASS | Nonces e permission_callbacks presentes |
| Seguranca — DB/Arquivos | PASS | Queries preparadas, caminhos hardcoded |
| Privacidade | FALHA | Sem wp_add_privacy_policy_content(), sem exporter/eraser |
| External Assets | ALERTA | Select2 do CDN, MapLibre do unpkg, Google Fonts |
| Dashboard Hijacking | PASS | Sem redirecionamentos forçados ou notificacoes intrusivas |
| Trialware/Upsell | PASS | Sem funcionalidade bloqueada |
| Tracking | PASS | Sem analytics/telemetry |
| Bibliotecas WP | PASS | Nao inclui jQuery ou outras libs padrao localmente |
| Uninstall | FALHA | Cleanup incompleto — deixa AI logs e vector stores |
| Build/Code Quality | PASS | Codigo legivel, sem eval/exec, sem ofuscacao |
Veredicto: NAO ADERENTE para submissao na WordPress.org Plugin Directory.
1. Licenca (Diretriz #1)
| Item | Status | Detalhe |
|---|---|---|
| LICENSE (repo root) | ALERTA | Texto e GPL v3, nao GPL v2 |
| src/LICENSE.txt | ALERTA | Texto e GPL v3 |
| readme.txt License | PASS | Declara GPL-2.0+ |
| jeo.php License | PASS | Declara GPL-2.0+ |
Recomendacao: O arquivo LICENSE deveria conter o texto da GPL v2, ou o header deveria ser atualizado para GPL-3.0-or-later para alinhar com o arquivo.
2. readme.txt (Diretriz #12, #15)
| Header | Status | Valor |
|---|---|---|
| Contributors | PASS | earthjournalism |
| Tags | FALHA | AUSENTE — necessario 1 a 12 tags |
| Tested up to | PASS | 6.8.2 |
| Stable tag | PASS | 3.6.5 |
| Requires PHP | ALERTA | 8.0 (mas jeo.php exige 8.2+ em runtime) |
| Requires at least | PASS | 6.6 |
| License | PASS | GPL-2.0+ |
| Third Party Services | PASS | Presente |
Acoes:
1. Adicionar header Tags: com 1-12 tags relevantes (ex: maps, geolocation, gutenberg, storymap, cartography, mapbox, maplibre, blocks, interactive, journalism, openstreetmap, spatial)
2. Sincronizar Requires PHP com o runtime check (8.2).
3. Seguranca
3.1 Superglobals e Sanitizacao — PASS
Todos os acessos a $_GET/$_POST estao sanitizados via sanitize_text_field, sanitize_key, etc.
3.2 REST API — PASS
Todas as rotas REST tem permission_callback apropriado.
3.3 AJAX Endpoints — ALERTA
| Endpoint | Nonce | Capability |
|---|---|---|
wp_ajax_jeo_geocode |
check_ajax_referer |
AUSENTE |
wp_ajax_jeo_reverse_geocode |
check_ajax_referer |
AUSENTE |
Recomendacao: Adicionar current_user_can('edit_posts') para defesa em profundidade.
3.4 Output Escaping — FALHA CRITICA
Arquivo: src/includes/loaders.php, funcao jeo_custom_settings_css()
Valores das settings sao concatenados diretamente em CSS sem escape adequado:
- $jeo_font usa wp_kses(..., null) — nao escapa aspas CSS
- $jeo_info_font_size sem casting numerico
- Cores sem sanitize_hex_color()
Fix necessario: Aplicar esc_attr() a fontes, floatval() a tamanhos, sanitize_hex_color() a cores.
4. Privacidade
4.1 wp_add_privacy_policy_content() — FALHA
Status: NAO implementado.
O plugin coleta e processa dados pessoais (geolocalizacao, logs de AI, vector stores).
Fix: Implementar wp_add_privacy_policy_content() descrevendo:
- Servicos de terceiros usados
- Retencao de dados de geolocalizacao
- Retencao de logs de AI
4.2 Personal Data Exporter / Eraser — FALHA
Status: NAO implementados.
O plugin armazena dados pessoais em post meta (_related_point, _jeo_ai_pending_point) e CPT (jeo-ai-log).
Fix: Registrar callbacks via wp_privacy_personal_data_exporter e wp_privacy_personal_data_eraser.
4.3 Browser Geolocation — ALERTA
Arquivo: src/js/src/stories-near-you/stories-near-you-frontend.js
Chama navigator.geolocation.getCurrentPosition() automaticamente ao carregar a pagina, sem dialogo de consentimento.
Fix: Adicionar um botao "Usar minha localizacao" em vez de solicitar automaticamente.
5. External Assets (Diretriz #8)
| Dominio | Asset | Context | Status |
|---|---|---|---|
cdnjs.cloudflare.com |
Select2 CSS/JS | Settings page | ALERTA — nao e fonte nem SaaS |
unpkg.com |
MapLibre GL JS | Admin dashboard | ALERTA — deveria usar a versao do WordPress ou bundle local |
fonts.googleapis.com |
Google Fonts | Frontend/admin | ALERTA — WP.org prefere fontes locais |
fonts.openmaptiles.org |
MapLibre glyphs | Build output | REMOVIDO em correcao anterior |
raw.githubusercontent.com |
Leaflet icons | Source/build | REMOVIDO em correcao anterior |
Recomendacao: Bundle local do Select2 e considerar fontes locais.
6. Uninstall (Diretriz de Privacidade)
Arquivo: src/uninstall.php
| Dado | Cleanup | Status |
|---|---|---|
jeo-settings (option) |
delete_option | PASS |
Post meta (_related_point, _geocode_*) |
PRESERVADO intencionalmente | ALERTA |
CPT jeo-ai-log |
NAO removido | FALHA |
Vector stores (wp-content/uploads/jeo-ai-store/) |
NAO removido | FALHA |
Options auxiliares (jeo_bulk_ai_cron_logs, etc.) |
NAO removidos | FALHA |
Transients (jeo_nominatim_*) |
NAO removidos | FALHA |
Fix: Remover CPTs, opcoes auxiliares, transients e vector stores no uninstall. Post meta pode ser opcional.
7. Dashboard Hijacking (Diretriz #11)
Status: PASS
- Sem redirecionamento pos-ativacao
- Sem notificacoes persistentes ou promocionais
- Sem widgets no dashboard
- Sem upselling
8. Trialware (Diretriz #5)
Status: PASS
- Sem funcionalidade bloqueada por pagamento
- Sem licenca/trial/upgrade
9. Tracking (Diretriz #7)
Status: PASS
- Sem analytics (Google Analytics, Matomo, etc.)
- Sem tracking pixels
- Sem telemetry
- Sem setcookie()
10. Bibliotecas Padrao do WordPress (Diretriz #13)
Status: PASS
- Nao inclui jQuery, jQuery UI, SimplePie, PHPMailer, PHPass localmente
- Usa
wp_enqueue_script()para dependencias do WordPress
11. Build / Code Quality (Diretriz #4)
Status: PASS
- Codigo fonte legivel (sem obfuscacao)
- Sem uso de
eval(),exec(),system(),shell_exec() - Bundles minificados gerados por webpack, com source disponivel em
src/js/src/
Checklist de Acoes para Deploy
CRITICO (bloqueia aprovacao)
- [ ] Adicionar Tags no readme.txt (1-12 tags)
- [ ] Corrigir CSS escaping em
loaders.php(jeo_custom_settings_css()) - [ ] Implementar
wp_add_privacy_policy_content() - [ ] Implementar Personal Data Exporter e Eraser
- [ ] Completar uninstall (remover AI logs, vector stores, opcoes auxiliares)
ALTO (recomendado)
- [ ] Sincronizar
Requires PHPpara 8.2 no readme.txt - [ ] Adicionar capability check aos endpoints AJAX de geocoding
- [ ] Adicionar consentimento explicito para geolocalizacao no Stories Near You
- [ ] Bundle local do Select2 (evitar CDN externo)
- [ ] Licenca: Alinhar texto do arquivo LICENSE com o header (GPL v2 ou v3)
MEDIO (melhoria)
- [ ] Fontes locais: Considerar self-hosting das fontes Google
- [ ] MapLibre: Documentar que o carregamento do unpkg e uma dependencia de servico