Vous n'êtes pas identifié(e).
Pages : 1
Hello
J'ai trouvé un petit bug dans le module RSS de la 094: il ne génère pas un fichier conforme à la norme xml.
Si l'un de vos utilisateurs a la bonne idée de mettre un & dans le titre d'une page, il vous génère un flux invalide à cause de ce &.
En fait, il y a 5 caractères qui doivent être encodés.
La solution : un bon coup de htmlspecialchars() qui s'occupe justement de ces 5 caractères...
J'en ai également profité pour autoriser quelques balises en plus.
Ma contribution (pensez à modifier le commentaire d'intro)
[== PHP ==]
<?php
/*
module: Création d'un serveur RSS et d'un lecteur RSS
Copyright Jean-Paul GIAUSSERAND 2010-2011
Site: http://www.giausserand.fr/index.php?perma=ziteplus
Licence : Creative Commons CC-BY-NC-SA
Historique:
proposition1.4 - ajout de htmlspecialchars pour respecter la norme xml et quelques tags en plus (Super_chemist)
1.3 - possibilité de fixer la page racine du flux RSS
1.2 - Actualisation auto du fichier
1.1 - paramètre de configuration
1.0 - création du module serveur
*/
class Trss extends Tmodule {
protected function makeRSS(){
function ischild($ancestor,$descendant){
while ((Tmodule::$cms->struct[$descendant][cPagePere]!=$ancestor) && (Tmodule::$cms->struct[$descendant][cPageRang]!=1)&&($descendant>1))
$descendant = Tmodule::$cms->struct[$descendant][cPagePere];
return TModule::$cms->struct[$descendant][cPagePere]==$ancestor;
};
function normaliser($s) {
return utf8_encode(html_entity_decode($s,ENT_COMPAT,'ISO-8859-15')); // mettre en parametre le ISO-8859-15
}
function notag($s){
return trim(preg_replace('@(<br />)+@is','<br />', str_replace(array('<br/>','<br>'),array('<br />','<br />'),strip_tags($s,'<li><br><p><a><h1><h2><span><strong><em><img>'))));
}
$logo=$this->getOption('logo');
$lang=$this->getOption('lang');
$ttl=$this->getOption('ttl');
$out='';
$out.='<?xml version="1.0" encoding="UTF-8"?'.'><rss version="2.0">';
$out.='<channel>';
$out.='<title>'.htmlspecialchars(normaliser(self::$cms->get_data('site_title').' '.self::$cms->get_data('site_subtitle'))).'</title>';
$out.='<description>'.htmlspecialchars(normaliser(self::$cms->get_data('site_description'))).'</description>';
$out.='<link>'.self::$cms->makeURL(0,true).'</link>';
$out.='<language>'.$lang.'</language>';
$out.='<generator>ZitePLUS-Module RSS, V1.3 ,Licence Creative Commons CC-BY-NC-SA</generator>';/*cette ligne ne doit pas être altérée pour respcter la licence*/
$out.='<ttl>'.$ttl.'</ttl>';//en minutes
$out.='<pubDate>'.date("r", filemtime(self::$cms->ipath.'/rss.xml')).'</pubDate>';
$out.='<lastBuildDate>'.date("r", filemtime(self::$cms->cpath.'/structure.dta')).'</lastBuildDate>';
if (isset($logo)) $out.='<image><url>'.self::$cms->rewritebase.'thumb.php/'.$logo.'</url><title>'.htmlspecialchars(normaliser(self::$cms->get_data('site_title').' '.self::$cms->get_data('site_subtitle'))).'</title><link>'.self::$cms->makeURL(0,true).'</link></image>';
$base = self::$cms->rewrite ? '' : self::$cms->base;
$max = count(self::$cms->struct);
$istart=self::$cms->page_from_ident($this->getOption('basepage'));
if (empty($istart)) {
$istart=1;
$iend=$max+1;
} else {
$iend=$istart+1;
while (ischild($istart,$iend)&&($iend<=$max)) ++$iend;
}
for ($i=$istart; $i<$iend; $i++) {//!! il faut restreindre aux pages visibles par tout lemonde !!!
if (self::$cms->isPageAuth($i,cPageRead,array('all'))) {//modif 091
$page = self::$cms->struct[$i];
if ($page[cPageOn] && (($page[cPageType]&pgbitType)!=5)&&($page[cPageIdent][0]!='_')) {
$out .= '<item>';
$out .= '<title>'.htmlspecialchars(utf8_encode(html_entity_decode($page[cPageTitre]))).'</title>';
$out .= '<description><![CDATA['.normaliser(isset($page[cPageDesc])?$page[cPageDesc]:notag(file_get_contents(self::$cms->cpath.'/'.$page[cPageIdent].'.txt'))).']]></description>';
/**/ $out .= '<link>'.self::$cms->makeURL($i,true).'</link>';
$out .= '<guid>'.self::$cms->makeURL($i,true).'</guid>';
$out .= '<pubDate>'.date("r", filemtime(self::$cms->cpath.'/'.$page[cPageIdent].'.txt')).'</pubDate>';
$out .= '</item>';
}
}
}
$out.= '</channel></rss>';
return self::$cms->writefile(self::$cms->ipath.'/rss.xml',$out);
}
function dojob($opt="") {
//
parent::dojob();
$out='';
$logo=$this->getOption('logo');
$ttl=$this->getOption('ttl');
$lang=$this->getOption('lang');
if (isset($_POST['submit'])) { // génération sitemapXML
//
$this->makeRSS()?self::$cms->msgShow('done_ok'):self::$cms->msgShow('done_failed');
$out = '';
}
$out .= '<form method="post" action="'.self::$cms->base.'module|rss" enctype="multipart/form-data"><table class="ztable">';
$out2= ($this->isConfig($this->modulename)?'<a href="'.self::$cms->base.'selectmodule|config|'.$this->ident.'" title="'.$this->get_message('moduleconf').'"><img src="deco/config.png"/></a>':'');
$out .= '<tr><td colspan="2" style="text-align:center"><span style="float:right">'.$out2.'</span><center><strong>'.$this->get_message('title').'</strong></center></td></tr>';
$out .= '<tr><td colspan="2">'.$this->get_message('intro').'</td></tr>';
//
$out.='<tr><td width="150px"></td><td></td></tr>';
//
$out .= '<tr><td colspan="2"><input type="submit" name="submit" value="'.self::$cms->get_message('submit').'" /></td></tr></table></form>';
if (file_exists(self::$cms->ipath.'/rss.xml')) {
$out .= '<table class="ztable">';
$out .= '<tr><td>'.$this->get_message('rssfiledate').date("d/m/Y à H:m:s", filemtime(self::$cms->ipath.'/rss.xml')).'</td></tr>';
$out .= '<tr><td><textarea rows=30 cols=70 wrap=on readonly>'.str_replace('<url',"\n<url",file_get_contents(self::$cms->ipath.'/rss.xml')).' </textarea></td></tr>';
$out .= '</table>';
}
return $out;
}
protected function Register() {//Appelé lorsque le module est activé
self::$cms->register_event(eHead,eBefore,$this->modulename);
self::$cms->register_event(eLogout,eBefore,$this->modulename);
}
function Event($event,$mode,&$out,$opt=null) {
if ($event==eHead && $mode==eBefore){
$out.='<link rel="alternate" type="application/rss+xml" title="RSS" href="'.self::$cms->makeURL(0,true).'rss.xml" />';
} else if ($event==eLogout && $mode==eBefore && $this->getOption('rssauto')){
if (!empty($_SESSION['zite_usergroup'])&&($_SESSION['zite_usergroup']!=array('logon'))){
if (filemtime(self::$cms->ipath.'/rss.xml')<filemtime(self::$cms->cpath.'/structure.dta') ) {
if (!$this->makeRSS()) {
self::$cms->msgShow('Génération auto flux RSS');
self::$cms->msgShow('done_failed');
}
}
}
}
}
}
?>
Pour correction :-)
Adrien
Hors ligne
Ok merci
je regarde et j'intègre
a+
jean-Paul
Hors ligne
Pages : 1