Restriction de contenu dans l’espace public et privé par le « bloc statut »

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Gerer l’accessibilité du contenu des pages, afficher un contenu différent, tant dans l’interface privée que publique en fonction du statut de l’internaute n’importe où dans vos textes.

La question de la gestion des droits d’accès tant dans l’interface privée que publique revient régulièrement dans plusieurs listes de discussions. Plusieurs contribs proposent déjà différentes solutions. Alors pourquoi une autre ?

La presque totalité d’entre elles propose de contrôler l’accès à un article ou à une rubrique dans l’interface publique mais pas dans l’interface privée.

De plus, on limite normalement l’accès à la totalité d’une page et non pas à une partie.

Pour offrir une version différente d’une page selon le statut de l’internaute, il faut souvent créer plusieurs pages.

Plusieurs demandent la création et l’ajout à vos pages existantes de nouveaux mots-clés.

Elles impliquent également plusieurs modifications à vos squelettes.

Cette contrib ne demande aucune modification à vos squelettes actuels ni aucune modification au coeur de SPIP.

Elle permet d’afficher, tant dans l’interface privée que publique, n’importe où à l’intérieur de vos textes, un contenu différent selon le statut de l’internaute par l’utilisation de tags au moment de la rédaction de vos textes et ce, sans mot-clé.

Ce sont les tags ou bloc statut

Comment ça marche ?

Les tags <statut></statut> ou « bloc statut » sont librement inspirés des tags ou « bloc multi » <multi></multi> de SPIP. Ils permettent d’afficher, tant dans l’espace privé que public, des contenus différents selon le statut de l’internaute.

On peut utiliser ces tags dans :
-  les articles [1]
-  les rubriques [2]
-  les brèves [3]
-  les auteurs [4]
-  les sites référencés [5]

Exemple d’utilisation du « bloc statut » :

<statut>
[ad]
Les Administrateurs identifiés seront les seuls à voir ce texte dans l'interface privée et publique.
[re]
Les rédacteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
[vi]
Les Visiteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
[pu]
Les personnes non identifiés verront ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
</statut>

Deux possibilités d’affichage pour l’administrateur dans l’interface privée

-  Afficher seulement la version réservée aux administrateurs. Si elle n’existe pas, afficher la version réservée aux Rédacteurs. Si elle n’existe pas, afficher la version réservée aux Visiteurs.

-  Afficher toutes les versions. Si elle existe, afficher la version réservée aux Administrateurs. Si elle existe, afficher la version réservée aux Rédacteurs. Si elle existe, afficher la version réservée aux Visiteurs pour l’interface publique. Si elle existe, afficher la version pour les personnes non identifiées pour l’interface publique.

Une seule possibilité pour le rédacteur dans l’interface privée

Si elle existe, afficher la version réservée aux Rédacteurs. Si elle n’existe pas, afficher la version réservée aux Visiteurs. Si elle n’existe pas, afficher la version pour les personnes non identifiées pour l’interface publique.
Si elle n’existe pas, ne rien afficher.

Chaque version est identifiée dans l’interface privée par les mêmes icônes qui identifient le statut des auteurs.
Pour la version publique, on a choisi le +.

Et dans l’interface publique ?

Les partie de texte contenues dans le « bloc statut » ne seront affichées dans l’interface publique que pour les personnes ayant le statut requis.

Où peut-on utiliser le « bloc statut » ?

Le « bloc statut » peut être utilisé partout où est utilisable actuellement le « bloc multi »

Qui peut avoir besoin du « bloc statut » ?

Ses particularités peuvent répondre aux besoins de certains sites qui désirent limiter l’accessibilité de certaines informations aux seuls administrateurs du site dans l’interface d’administration. En effet, ceci n’est pas encore possible, même avec la nouvelle version 1.8.2.

Imaginons un site corporatif qui veut ouvrir l’espace de rédaction de son site SPIP à des consultants extérieurs, sans leur révéler certaines listes de prix ou contacts. L’auteur administrateur n’aura qu’à mettre l’information entre tags <statut>[ad]...</statut> pour en limiter l’accès aux administrateurs identifiés même dans l’espace privé.

Procédures

Option 1 :
-  Téléchargez le fichier mes_options.php3.txt

Fonctions pour les blocs statuts
Placez ce fichier dans le dossier ecrire de votre site renommez-le sans l’extention .txt ou copier/coller son contenu dans votre fichier mes_options.php3 s’il existe déjà.


-  Copiez et collez son contenu dans votre fichier mes_options.php3 dans le dossier ecrire s’il existe déjà.
-  Sinon, copiez et collez le ficher dans le dossier ecrire et renommez-le fichier en supprimant l’extension .txt (mes_options.php3) .
-  Téléchargez le fichier mes_fontions.php3.txt

Fonctions pour les blocs statuts (15/10/2005)
Placez ce fichier dans le dossier ecrire de votre site renommez-le sans l’extention .txt ou copier/coller son contenu dans votre fichier mes_options.php3 s’il existe déjà.


-  Copiez et collez son contenu dans votre ficher mes_fonctions.php3 à la racine de votre site spip s’il existe déjà.
-  Sinon, copiez et collez le ficher à la racine de votre site spip et renommez-le fichier en supprimant l’extension .txt (mes_fonctions.php3) .

Option 2 :

Suivez l’explication des modifications suivantes et modifiez vous-même les fichiers déjà en place sur votre site.

Explications des modifications

Nous allons créer un jeu de fonctions directement inspiré de celui permettant d’utiliser les tags où on remplacera la vérification de la langue par la vérification du statut de l’internaute.

Fichier mes_options.php3 (dossier ecrire)

function avant_propre($texte) {
 return extraire_statut($texte);
}

function multi_statut ($trads) {
	// Donner la valeur 1 à la variable $affiche_tout pour permettre aux administrateurs de voir dans l'interface privée toutes les versions.
	// Donner la valeur 0 à la variable $affiche_tout pour permettre aux administrateurs de voir dans l'interface privée toute la même version
	// qu'il verront dans l'interface publique
	$affiche_tout=1;
	global $id_rubrique;
	$image = 'visit-12.gif';
	
    $statut = $GLOBALS['auteur_session']['statut'];
	// S'il n'y a aucun texte spécifique pour les visiteurs, afficher pour les visiteurs le texte par défaut
	if ($trads['vi']=='')$trads['vi']=$trads['pu'];
	// S'il n'y a aucun texte spécifique pour les rédacteurs, afficher pour les rédacteurs le texte le texte des visiteurs
	if ($trads['re']==''){
		$trads['re']=$trads['vi'];
		}else{
		$image = 'redac-12.gif';
		}
		
	// S'il n'y a aucun texte spécifique pour les administrateurs, afficher pour les administrateurs le texte le texte des rédacteurs
	if ($trads['ad']==''){
		$trads['ad']=$trads['re'];
		}else{
			$image = 'admin-12.gif';
		}
	
	switch ($statut) {
	case '0minirezo':
			$statut='ad';
			if ($trads[$statut]!='')
			$afficher = " <img src=\"" . _DIR_IMG_PACK . $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
			break;
	case '1comite':
			$statut='re';
			if (isset($trads[$statut])&&strlen($trads[$statut])!=''){
			$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
			}
			break;
	case '6forum':
			$statut='vi';
			break;
	default:
			$statut='pu';
			break;
	}
 
	if (isset($trads[$statut])) {
		// dans l'espace prive, mettre une image admin
		if (!_DIR_RESTREINT) {
		if($statut=='ad'&&$affiche_tout){
			if ($trads['ad']!=''&&$trads['ad']!=$trads['re']){
				$image = 'admin-12.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
				$retour = $afficher.$trads['ad'].$afficher;
			}
			if ($trads['re']!=''&&$trads['re']!=$trads['vi']){
				$image = 'redac-12.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
				$retour .= '<br />'.$afficher.$trads['re'].$afficher;
			}
			if ($trads['vi']!=''&&$trads['vi']!=$trads['pu']){
				$image = 'visit-12.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
				$retour .= '<br />'.$afficher.$trads['vi'].$afficher;
			}
			if ($trads['pu']!=''){
				$image = 'plus.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
				$retour .= '<br />'.$afficher.$trads['pu'].$afficher;
			}
			return $retour;
			}
			if ($statut=='ad'&&$trads['ad']!=''&&$trads['ad']!=$trads['re']){
				$image = 'admin-12.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
			}else if ($trads['re']!=''&&$trads['re']!=$trads['vi']&&$trads['re']!=$trads['pu']){
				$image = 'redac-12.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
			}else if ($trads['vi']!=''&&$trads['vi']!=$trads['pu']){
				$image = 'visit-12.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
			}
			else if ($trads['pu']!=''){
				$image = 'plus.gif';
				$afficher = " <img src=\"" . _DIR_IMG_PACK .  $image."\" alt=\"(statut)\" title=\"$survol\" height=\"12\" width=\"12\" border=\"0\" /> ";
			}
			return $afficher.$trads[$statut].$afficher;
		}
		
		return $trads[$statut];

	}
	else if (ereg('^([a-z]+)_', $statut, $regs) AND isset($trads[$regs[1]])) {
		return $trads[$regs[1]];
	}
	else  return array_shift($trads);
}

// analyse un bloc statut
function analyse_statut ($bloc) {
	$statut = 'pu';
	// Créer par défaut un tableau avec des valeurs vides
	$trads= array('','pu'=>'','ad'=>'','re'=>'','vi'=>'');
	while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/si", $bloc, $regs)) {
	//while (preg_match("/^(.*?)[\[]([a-z_]+)[\]]/si", $bloc, $regs)){//http://permalink.gmane.org/gmane.comp.web.spip.devel/29558
		$texte = trim($regs[1]);
		if ($texte OR $statut)
			$trads[$statut] = $texte;
		$bloc = substr($bloc, strlen($regs[0]));
		$statut = $regs[2];
	}
	$trads[$statut] = $bloc;

	return multi_statut($trads);
}

// repere les blocs statut dans un texte et extrait le bon
function extraire_statut ($letexte) {
	if (strpos($letexte, '<statut>') === false) return $letexte; // perf
	if (preg_match_all("@<statut>(.*?)</statut>@s", $letexte, $regs, PREG_SET_ORDER))
		foreach ($regs as $reg)
			$letexte = str_replace($reg[0], analyse_statut($reg[1]), $letexte);
	return $letexte;
	
}

Pour conserver dans le système cache des versions différentes selon le statut de l’internaute, on ajoute dans l’url de la page la variable statut en saisissant automatiquement la valeur dans la variable $GLOBALS[’auteur_session’][’statut’]) .

Il est impossible de passer manuellement une valeur erronnée. Merci à Mortimer pour cette astuce.

Fichier mes_fonctions.php3 [6]

if((!isset($_GET['statut'])&&isset($GLOBALS['auteur_session']['statut']))||addslashes($_GET['statut']) != $GLOBALS['auteur_session']['statut']){
$link = $GLOBALS['clean_link'];
$link->delvar('statut');
$link->addvar('statut',$GLOBALS['auteur_session']['statut']);
redirige_par_entete($link->getUrl());
}

À vous de jouer !

Merci de nous aider à améliorer cette contrib en nous signalant toute amélioration possible dans le code ou dans nos explications.

Notes

[1Seuls les champs titre, sur-titre et sous-titre d’un article ne peuvent utiliser les blocs statut.

[2Seul le champ Texte d’une rubrique peut utiliser les blocs statut.

[3Seul le champs Texte de la brève peut utiliser les blocs statut.

[4Seul le champs Qui êtes-vous ?
de l’auteur peut utiliser les blocs statut.

[5Seul le champs Description du site d’un site référencé peut utiliser les blocs statut.

[6Dernière mise à jour 15-10-2005

Discussion

6 discussions

  • Très bonne contribution notamment si on l’intègre au plugin balise_session comme je l’ai fait en modifiant la contribution originale.

    Répondre à ce message

  • 7


    [ad]
    Les Administrateurs identifiés seront les seuls à voir ce texte dans l’interface privée et publique.

    Je viens d’installer cette contrib et de mettre le tag status ci dessus dans le champs texte d’une rubrique de test.

    On voit à partir du site public (donc sans login) la rubrique et son contenu.

    Si vous pouviez m’éclairer parce que là je suis dubitatif

    • Tu n’aurais pas oublié de te déconnecter après avoir publié l’article ? As-tu testé avec

      <statut>
      [ad]
      Les Administrateurs identifiés seront les seuls à voir ce texte dans l'interface privée et publique.
      [re]
      Les rédacteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
      [vi]
      Les Visiteurs identifiés seront les seuls à voir ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
      [pu]
      Les personnes non identifiés verront ce texte dans l'interface publique. Dans l'interface privée, les Administrateurs verront également ce texte pour faciliter la validation.
      </statut>

      Si tu ne vois que la partie pour l’administrateur dans l’espace public, c’est que tu étais toujours connecté comme administrateur.

      Donne-moi en des nouvelles.

    • Est-ce dans la page sommaire.php3 dans l’introduction à l’article ( balise #INTRODUCTION) ?

    • Voilà des nouvelles.

      Je pense que je n’avais pâs bien saisi le sens de cette contrib.En fait ce que je veux c’est qu’une rubrique n’apparaisse pas du tout sur le site publique si elle est réservé au admin et au rédacteur.Le pb c’est qu’avec ta solution les personneS ne devant pas avoir accés à la rubrique voient quand même qu’elle existe et je trouve que c’est de nature à créer le malaise. me trompe je ?

      En fait j’aimerai que certaines rubriques soient exploitées par certains administrateurs et rédacteurs sans qu’ils puissent intervenir sur les rubriques qui ne les concernent pas.En suite l’idéal serait (pour moi) de ne rendre visibles que certaines rubrique à certains visiteurs.

      Je me demande quelle est la meilleures solution pour obtenir coté admin et rédacteur le résultat que propose l’addon XPROTECTOR.

    • Bonjour,

      Je continu à tester ta contrib et je me suis apercu que si un admin met une restriction de visibilité sur, par exemple le texte d’une rubrique qui était jusque la visible, et qu’il ne prend pas soin de recalculer la page correspondante ou de vider le cache, le visiteur voit quand même la version qui est dans le cache et qui contient le texte visible avant la restriction.
      Est ce que tu as aussi constaté ça ?

      Cordialement,

      Serge

    • Oui, c’est normal. On doit récalculer la page pour remplacer celle-ci dans le cache.

    • ->« En fait ce que je veux c’est qu’une rubrique n’apparaisse pas du tout sur le site public si elle est réservée au admin et au rédacteur »

      J’ai également ce besoin. Ç’est plus de l’ordre de la contrib Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.

      -> « En fait j’aimerai que certaines rubriques soient exploitées par certains administrateurs et rédacteurs sans qu’ils puissent intervenir sur les rubriques qui ne les concernent pas. »

      Je t’invite à en discuter sur cette autre contrib. Mais si je comprends bien,
      ton besoin serait de combiner cette autre contrib avec une fonction que je n’ai pas encore documentée et qui applique la visibilité par statut également dans l’interface privée.

      -> « En suite l’idéal serait (pour moi) de ne rendre visibles que certaines rubrique à certains visiteurs.
      Je me demande quelle est la meilleures solution pour obtenir coté admin et rédacteur
      le résultat que propose l’addon XPROTECTOR »

      Je n’ai jamais utilisé XPROTECTOR.
      Je veux rester TOUT SPIP dans la mesure du possible et j’y arrive pour le moment.

    • Bonjour je souhaiterais restreindre des rubriques dans l’espace privé pour que les rédacteurs n’écrivent pas des articles n’importe où...

      Comment faire ?

      Ou mettre les tags statut ?

      Merci d’avance

    Répondre à ce message

  • Bonjour je souhaiterais savoir si la Restriction de contenu dans l’espace public et privé par le « bloc statut »
    est possible avec la version multispip version 1.6 ?
    mercci de de bien voulloir me répondre.

    Pat2

    Répondre à ce message

  • 1

    J’ai installé sur un site en local (squelette sarka) les deux contribs :
    -  Restriction de contenu dans l’espace public et privé par le « bloc statut »
    et
    -  Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.

    Je crée une rubrique avec le mot-clé administrateur et à l’intérieur un article (pas de mot-clé) contenant ce texte :

    <statut>
    [pu]
    Des informations publiques sur la vie du collège.
    [re]Des informations complémentaires visibles par l'ensemble des rédacteurs, profs et élèves
    [ad]
    Ces informations ne sont visibles que des administrateurs du site.
    
    </statut>

    Depuis la partie publique (cache vidé dans spip et du navigateur, cookie supprimé, déconnecté) :

    -  si j’essaie d’accèder à la rubrique en suivant l’arborescence, pas de souci, je vais sur spip-login ou on me demande une oidentification.
    -  mais dans les « derniers articles publiés » de ma page d’accueil, j’ai un article contenant ceci :
    "Informations générales

    [pu] Des informations publiques sur la vie du collège. [re]Des informations complémentaires visibles par l’ensemble des rédacteurs, profs et élèves [ad] Ces informations ne sont visibles que des administrateurs du site.

    lire la suite de l’article « - si je clique sur »Lire la suite« , j’ai bien ceci : »Des informations publiques sur la vie du collège. "

    DONC, y a comme un truc qui a du m’échapper !!??

    merci d’un coup de main.

    • Le problème vient de la fonction couper_intro() utilisée dans le calcule de la balise #INTRODUCTION.

      On pourrait la modifier ou, plus propre, surcharger la fonction de calcule de cette balise en ajoutant le code suivant dans le fichier mes_fonctions.php3

      /***************************************************************************\
       *  Gestion des blocs réservés par les tags   <statut></statut>            *
       *  Modification ajoutée le 15/12/2005 par son auteur:Iago                 *
       *                                                                         *
       *  Surcharge de la fonction standard de calcul de la balise #INTRODUCTION *
       *  Cette surcharge permet d'utiliser la fonction extraire_statut()        *
       *  qui n'est pas prise en charge par la fonction couper_intro()           *
       *                                                                         *
       *  Cette modification est détaillé dans l'article suivant:                *
       *  http://www.spip-contrib.net/Restriction-de-contenu-dans-l              *
       *                                                                         *
      \***************************************************************************/
      
      function introduction ($type, $texte, $chapo='', $descriptif='') {
      	switch ($type) {
      		case 'articles':
      			if ($descriptif)
      				return propre($descriptif);
      			else if (substr($chapo, 0, 1) == '=')	// article virtuel
      				return '';
      			else
      				return PtoBR(propre(supprimer_tags(couper_intro(extraire_statut($chapo)."\n\n\n".extraire_statut($texte), 500))));
      			break;
      		case 'breves':
      			return PtoBR(propre(supprimer_tags(couper_intro(extraire_statut($texte), 300))));
      			break;
      		case 'forums':
      			return PtoBR(propre(supprimer_tags(couper_intro(extraire_statut($texte), 600))));
      			break;
      		case 'rubriques':
      			if ($descriptif)
      				return propre($descriptif);
      			else
      				return PtoBR(propre(supprimer_tags(couper_intro(extraire_statut($texte), 600))));
      			break;
      	}
      }

      Ça devrait aller !

    Répondre à ce message

  • 1
    c.cormier

    Bonjour,
    Cette contrib est-elle compatible avec votre autre contrib du 20/10 ? :Comment restreindre l’accès d’un article ou d’une rubrique dans l’interface publique par le statut.
    20 octobre 2005 Iago
    Si non laquelle est la meilleure ?
    Cordialement

    Répondre à ce message

  • 2

    le bloc statut fonctionne-t-il dans un squelette, peut-on écrire

    <statut>
    [ad] message admin
    [re] message redacteur
    [vi] message vi
    [pu] message public
    </statut>

    ou mieux

    <statut>
    [ad] <INCLURE(admin.php3)>
    [re] <INCLURE(redacteur.php3)>
    [vi] message vi
    [pu] message public
    </statut>

    en tout cas, ça marche bien dans le corps de l’article

    • Son comportement est semblable aux blocs multi. Comme pour eux, ce n’est pas possible. En gros, la fonction, appellée par la fonction avant_propre(), est prise en compte dans les espaces texte et pas de le reste du squelette.

      Il faudrait concocter un autre fonction pour ça.

      Personnellement, j’ai déjà une fonction pour gérer l’affichage en fonction du statut dans les squelettes mais lié à un mot clé. Je l’utilise pour afficher ou non les titres des rubriques et des articles, par exemple, dans les menus selon le statut de l’internaute. Je ne veux pas qu’une rubrique dont il n’a pas l’accès soit visible, même dans le plan, si l’internaute ne peut la visiter. Ça évite des frustrations.

      Avec quelques modifications, ça pourrait faire l’affaire... Mais ce serait une autre histoire ( une autre contrib...).

    • c.cormier

      Bonjour,
      Cette fonction m’intéresse bigrement. A quand la contribution ?
      Cordialement

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom