Forum ZitePLUS

La communauté des utilisateurs du CMS ZitePLUS

Vous n'êtes pas identifié(e).

#1 05/10/2014 22:40:20

Super_chemist
Membre
Inscription : 27/05/2011
Messages : 417

Module RSS

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

#2 11/10/2014 12:20:25

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : Module RSS

Ok merci smile
je regarde et j'intègre

a+
jean-Paul

Hors ligne

Pied de page des forums