Lecteur Markdown
RSS_FEEDER_DOCUMENTATION
RSS Feeder — Agrégateur RSS/RDF avec cache et Garbage Collection #
Description #
Agrégateur RSS communautaire avec modération, cache SQL, catégorisation automatique et administration du cache. Les utilisateurs peuvent soumettre des flux RSS, les modérateurs les valident, et le contenu est parsé en XML puis mis en cache en base de données.
Originellement créé en 2006, le plugin est activement maintenu à jour.
Fonctionnalités #
Gestion des flux #
- Soumission de flux RSS par les utilisateurs enregistrés (soumis à validation modérateur)
- Édition et suppression par les modérateurs
- Validation/activation des flux par les administrateurs
- Détection des doublons (même URL)
- Affichage des flux non validés en rouge pour les modérateurs
Parsing RSS #
- Parser XML natif PHP (`xml_parser_create`)
- Support RSS 2.0, RDF/DC
- Gestion des CDATA, entités HTML, encodages
- Détection des enclosures (images) par type MIME
- Récupération via cURL avec User-Agent, timeout 30s, suivi des redirections
- Sélecteur de backend si plusieurs flux dans une source
Cache SQL #
- Table `rss_cache` (MyISAM, FULLTEXT sur title/description/keywords)
- Création automatique de la table si absente
- Déduplication par `source_id` + `link`
- Extraction automatique de mots-clés de sécurité/IA (CVE, malware, ransomware, exploit, AI, etc.)
- Catégorisation automatique : `vulnerability`, `ai-news`, `threat`, `general`
Administration du cache (`rssact=admin`) #
- Dashboard : nombre d'items, ancienneté, items à supprimer, taille de la table
- Affichage de la configuration courante (rétention, fréquence GC, max items, debug)
- Statistiques par source (nombre d'items, pourcentage)
- Actions : exécuter le Garbage Collector, optimiser la table, vider le cache
- Confirmation requise pour le vidage complet
Garbage Collection #
- Dépend de `inc/rss_gc.inc.php` (include moteur, pas du plugin)
- Fonctions attendues : `rss_garbage_collect($force)`, `rss_gc_stats()`
- Suppression par ancienneté (`RSS_CACHE_RETENTION_DAYS`)
- Suppression par limite par source (`RSS_MAX_ITEMS_PER_SOURCE`)
- Fréquence configurable (`RSS_GC_FREQUENCY`) ou manuel uniquement
- Mode debug (`RSS_GC_DEBUG`)
Bug connu #
Ligne ~601 : `array_flip($mimetypes)` — la variable `$mimetypes` n'est pas définie dans le scope de `startElement()`. Elle devrait provenir d'un include ou d'une config globale mais n'est pas passée via `global`. Le fix :
function startElement($p, $tagName, $attrs)
{
global $insideitem, $tag, $enclosure, $mimetypes;
if($insideitem)
{
$tag = $tagName;
if(isset($attrs['TYPE']))
{
if(is_array($mimetypes))
{
$flipped_haystack = array_flip($mimetypes);
if(isset($flipped_haystack[$attrs['TYPE']]))
{
list($mime, $type) = explode('/', $attrs['TYPE'], 2);
if($mime == 'image' && !empty($attrs['URL'])) $enclosure = $attrs['URL'];
}
}
}
}
elseif($tagName == 'ITEM') $insideitem = TRUE;
else $enclosure = 0;
}
Si `$mimetypes` est défini ailleurs (lib, config, include moteur), il faut vérifier qu'il est bien disponible au moment du parsing. Sinon, le définir localement dans le scope du parsing ou dans la conf du plugin.
Sécurité #
- Hiérarchie à trois niveaux : `RSS_FEEDER_LEVEL_USER` (soumission), `RSS_FEEDER_LEVEL_MODERATOR` (édition/suppression/validation), `RSS_FEEDER_LEVEL_ADMIN` (administration du cache)
- Toutes les entrées utilisateur protégées
- Requêtes SQL préparées
- cURL avec `CURLOPT_SSL_VERIFYPEER = 0` et `CURLOPT_SSL_VERIFYHOST = 0` (attention : désactive la vérification SSL pour les flux RSS)
Structure #
/plugins/rss_feeder/
├── rss_feeder.php
├── /conf/
│ └── rss_feeder.conf.inc.php
├── /doc/
│ └── rss_feeder.md
├── /locale/
│ ├── rss_feeder.en.inc.php
│ └── rss_feeder.fr.inc.php
├── /css/
│ └── rss_feeder.css
└── /sql/
└── rss_feeder.sql
Dépendance externe : `inc/rss_gc.inc.php` (include moteur pour le Garbage Collector)
Tables SQL #
`rss_links` #
| Colonne | Description |
|-------------|--------------------------------------|
| id | Clé primaire |
| rsstitle | Titre du flux |
| rsslink | URL du flux RSS |
| submitter | Nom de l'utilisateur soumetteur |
| editor | Dernier éditeur |
| submitted | Date de soumission |
| edited | Date de dernière édition |
| activated | 0 = en attente, 1 = validé/public |
`rss_cache` #
| Colonne | Description |
|--------------|---------------------------------------------------|
| id | Clé primaire auto-increment |
| source_id | FK vers `rss_links.id` |
| title | Titre de l'article |
| description | Contenu/résumé |
| link | URL de l'article |
| pub_date | Date de publication |
| fetched_date | Date de mise en cache |
| category | Catégorie auto (vulnerability, ai-news, threat, general) |
| keywords | Mots-clés extraits automatiquement |
Index : `pub_date`, `source_id`, `category`, FULLTEXT(`title`, `description`, `keywords`)
Traductions #
55 clés dans `$dialrssf[]`. Couvre les instructions utilisateur/modérateur, les messages de confirmation, et l'intégralité du panneau d'administration du cache.
Points d'attention #
- Le panneau admin utilise du CSS inline — à migrer vers `rss_feeder.css` avec les variables CSS globales
- Les images d'enclosure RSS ne sont pas redimensionnées — à recadrer via CSS (`max-width`, `height: auto`)
- `CURLOPT_SSL_VERIFYPEER = 0` est un risque si les flux RSS sont sur HTTPS
- Les fonctions `cleandata()` et `addslashes()`/`stripslashes()` dans le parsing sont des vestiges pré-Sanitizer
- `die()` dans le `xml_parse` (ligne 756) devrait être remplacé par un `return` + message d'erreur
Changelog #
- 2.02.1 (2025-12-11) : Cache SQL avec catégorisation et extraction de mots-clés, panneau d'administration du Garbage Collector, statistiques par source
- 1.x (2002–2025) : Agrégateur RSS original avec parsing XML et modération