+SPIP-Core spip-3.0.23 -> spip-3.0.24 30 septembre 2016
+-------------------------------------------------------------
+
+r23176 | b_b | (lun. 26 sept. 2016) | report de r23174Depuis FF 49, la couleur #4444 est considérée valide, ce qui rend les labels du privé bien plus clairs que #666 qui était appliqué avant (ou sous chromium). On passe donc en #444, pour être certain d'avoir un contraste suffisant.Remarque : la couleur appliquée aux labels n'est jamais la même suivant la structure du formulaire (444, 666, 777, etc). Il serait inétréssant d'homogénéiser tout ça.
+r23178 | b_b | (mar. 27 sept. 2016) | Fix #3831 : report de r23141 et r23148
+r23183 | cedric | (mar. 27 sept. 2016) | Report de r23179 : ne pas afficher l'url brute venant de la request (Nicolas CHATELAIN)
+r23184 | cedric | (mar. 27 sept. 2016) | Report de r23180 : pas d'url absolue dans var_url (Nicolas CHATELAIN)
+r23191 | cedric | (mar. 27 sept. 2016) | Report de r23185 : Eviter aussi les urls absolues windows c:\xxx et supprimer le onfocus obsolete au profit d'un placholder innofensif (Nicolas Chatelain)
+r23192 | cedric | (mar. 27 sept. 2016) | Report de r23186 : echapper les guillemets dans les noms de fichier pour ne pas generer du code invalide (Nicolas Chatelain)
+r23193 | cedric | (mar. 27 sept. 2016) | Report de r23187 : proteger des var_url fantaisistes sur le validateur_xml
+r23196 | cedric | (mar. 27 sept. 2016) | Report de r23194 : proteger HTTP_REFERER et var_recherche qui seront utilisee dans le surlignage JS (Rastapopoulos)
+r23199 | cedric | (mar. 27 sept. 2016) | Report de r23197 : proteger les commentaires de debug des slow queries
+r23202 | cedric | (mer. 28 sept. 2016) | Report de r23200 : - ?exec=valider_xml n'est executable que par les webmestres- var_url ne doit pas contenir de ../../ ni de ..\..\ (windows)- elle ne lance une action que si on a un var_token qui correspond soit a la signature de l'action en POST soit a la signature de l'action+var_url en GET. Ceci evite de faire lancer le validateur par un lien malveillant fourni a un webmstre d'un site auquel on a pas acces (CSRF)(Nicolas Chatelain)
+r23208 | cedric | (ven. 30 sept. 2016) | Report de r23206 : verification plus generique pour prendre en compte le cas windows
+
+SPIP-plugins-dist spip-3.0.23 -> spip-3.0.24 30 septembre 2016
+-------------------------------------------------------------
+
+r99661 | cedric | (mar. 27 sept. 2016) | Report de r85602 : Fix http://core.spip.org/issues/2938 : quand on met un zip dans tmp/ le memoriser dans la session pour le nettoyer au hit suivant si ce n'est pas un $_POST (ie si on a abandonne l'upload/deballage). Au passage on met les zip dans un sous dossier tmp/zip/ plutot que directement dans tmp/
+r99662 | cedric | (mar. 27 sept. 2016) | Report de r99659 : Complement a r85602 : utiliser la variable de session et ne passer qu'un md5 du chemin du zip dans le formulaire
+
+
+SPIP-Core spip-3.0.22 -> spip-3.0.23 23 septembre 2016
+-------------------------------------------------------------
+
+r22923 | cedric | (ven. 11 mars 2016) | version : ici on est en 3.0.23-dev
+r22924 | cedric | (ven. 11 mars 2016) | oups commit par erreur dans r22923
+r22930 | fil | (dim. 13 mars 2016) | report de r22929 : le robot facebook est mechant mais il est aussi bete, il faut donc le laisser faire son travail + mise a jour de la version de l'écran
+r22941 | cedric | (jeu. 17 mars 2016) | define('_CALCUL_PROFILER',300) permet de loger dans le profiler les calculs de squelette qui prennent plus de 300ms(a eclaircir : quand une boucle est lente et prends plusieurs secondes, cela n'affecte pas le temps calcule ici)
+r22948 | cedric | (jeu. 17 mars 2016) | Report de r22946 : un pipeline auth_administrer permet de personaliser le retour des differentes fonctions d'auth (par exemple pour renforcer la verification du mot de passe, quand flux['args']['fonction']=='verifier_pass'
+r22950 | cedric | (jeu. 17 mars 2016) | Report de r22055 : Permettre de choisir une langue par defaut autre que le francais -- utile pour les sites a destination d'un public non francophone, et qui utilise des plugins partiellement traduits -- clot #3292
+r22951 | cedric | (jeu. 17 mars 2016) | Report de r22062 : Il manquait des elements pour que le parametrage de la langue par defaut soit operationnel
+r22983 | b_b | (mer. 13 avril 2016) | report de r22981ne plus limiter la longueur maxi des logins dans test_login()
+r23015 | denisb | (lun. 23 mai 2016) | ecrire/inc/utils.php : on affecte une vraie valeur à $prefs. report de r23013
+r23025 | b_b | (lun. 06 juin 2016) | report de r23023complément à r20876 : pas de data dans le champ url_site
+r23032 | cedric | (sam. 11 juin 2016) | Report de r23030 : Bugfix erreur SQL sur langue_choisie, notamment lors de la syndication :il faut verifier l'existence du champ qui n'est pas systematique avec un champ lang+ prendre un argument $serveur en plus par coherence+ reports precedents sur les appels de calculer_langues_rubriques()
+r23038 | cedric | (lun. 13 juin 2016) | Report de r23036 : fixer le bug d'inclusion introduit par r23030
+r23059 | cedric | (sam. 25 juin 2016) | Report de r23057 : recuperer_infos_distantes() renvoyait a tort un tableau avec pour seul argument un mime_type vide quand le document n'existait pas, pouvant laisser croire a son existence. On sort explicitement avec false dans ce cas, comme prevu. Et on essaye meme pas de recuperer l'URL si la source fournie n'en est pas une
+r23062 | cedric | (lun. 27 juin 2016) | Report de r23060 : suite de r23023 et r20876 : soyons carrement restrictif sur ce qu'on attend
+r23065 | cedric | (lun. 27 juin 2016) | Report de r23063 : Sanitizer/controler les entree fournies a valider_xml_ok (Thomas Chauchefoin)
+r23068 | cedric | (lun. 27 juin 2016) | Report de r23066 : passer entites_html sur les id ajax par precaution (Guillaume Fahrer)
+r23071 | cedric | (lun. 27 juin 2016) | Report de r23069 : quand on faisait recherche=/ cela etait considere a tort comme une regexp (Thomas Chauchefoin)
+r23079 | cedric | (mar. 28 juin 2016) | Report de r23077 : report de r23049 sans le bug : si la request string contient le protocole et le host, il faut les depiler (cf test http://zone.spip.org/trac/spip-zone/changeset/98585)
+r23100 | cedric | (mer. 06 juil. 2016) | Report de r23098 : tester_url_absolue() n'accepte pas le protocole file:// car on est sur le web
+r23105 | cedric | (jeu. 07 juil. 2016) | Report de r23103 : completer r23098 : exclure tous les protocoles qui ne sont pas des URL mais que php accepte dans ses fonctions de lecture (guy)
+r23108 | cedric | (jeu. 07 juil. 2016) | Report de r23106 : suite de 23103 : la casse qui peut tout casser
+r23111 | marcimat | (jeu. 07 juil. 2016) | Report de r23109 : Compléter r23103 : retirer le protocole 'zip' également, et phpdoc plus à jour.
+r23153 | cedric | (ven. 09 sept. 2016) | Report de r23151 : Eviter d'accepter n'importe quoi dans les redirect de l'espace prive (Tim Coen)
+r23156 | cedric | (mar. 13 sept. 2016) | Report de r23154 : Quand un charger_fonction echoue renvoyer un 404 (et inliner les css si jamais on cherhcait un /truc.api/ pour que le rendu soit bon)
+r23158 | marcimat | (lun. 19 sept. 2016) | Parenthèse en trop dans r23154 (RealET)
+r23167 | cedric | (jeu. 22 sept. 2016) | Report de r23165 : le modele de mail utilise lors de l'inscription est modifiable via le tableau options de inscrire_auteur()
+
+SPIP-plugins-dist spip-3.0.22 -> spip-3.0.23 23 septembre 2016
+-------------------------------------------------------------
+
+r96125 | b_b | (lun. 21 mars 2016) | report de r93291il ne faut pas faire une alerte si c'est le form de forum en dessous de la previsu qu'on submit a nouveaucf https://core.spip.net/issues/3515
+r96640 | Nicod | (ven. 15 avril 2016) | report de r96638Générer des urls publiques dans les notifications de forums publics.
+r97979 | Yohann | (mar. 24 mai 2016) | Ajout d’une fonction aux statistiques pour désactiver les referers. Des fois, on en a pas besoin, et ça prend de la place (beaucoup !) dans les tables SQL.
+r98016 | Francky | (mar. 24 mai 2016) | Il y a eu une coquille dans le dernier commit, la version passait de 0.4.36 à 0.4.4Je change le donc le z pour lui mettre 37
+r98068 | cedric | (jeu. 26 mai 2016) | Certains flux RSS publient l'integralite de leur contenus (par exemple http://www.lelotenaction.org/pages/do/rss.xml) ce qui produit inevitablement un timeout lors de l'analyse et de la syndication.On optimise les fonctions cdata_echappe et cdata_echappe_retour, et on limite la syndication aux 1000 premiers items, surchargeable par la constante _SYNDICATION_MAX_ITEMS
+r98104 | Yohann | (dim. 29 mai 2016) | On revert r97979 de la branche de maintenance.
+r98274 | rasta | (jeu. 09 juin 2016) | Backport de [98272] : Correction de bug : il manquait <!--affiche_milieu--> pour les documents, ce qui empêchait par exemple l'inseration des traductions ou autre ajout de ce genre.
+r98562 | cedric | (sam. 25 juin 2016) | Report de r98560 : plusieurs petits bugs sur les documents distants mal formates qui pourraient exister en base par des operations peu avouables, on teste systematiquement que le fichier ressemble bien a une URL avant de s'y fier
+r98605 | cedric | (mer. 29 juin 2016) | fix r96640 qui annoncait reporter r96638 mais avait reporte le true en false
+r99156 | b_b | (dim. 14 août 2016) | report de r99153revert de r86810Ref la kermesse de https://core.spip.net/issues/3368
+r99434 | cedric | (ven. 09 sept. 2016) | Report de r99431 : l'URL de rappel de mot de passe doit etre une URL safe, on la force sur l'adresse_site parametree dans la configuration du site
+
+
+
SPIP-Core spip-3.0.21 -> spip-3.0.22 10 mars 2016
-------------------------------------------------------------
* ------------------
*/
-define('_ECRAN_SECURITE', '1.2.4'); // 2016-03-10
+define('_ECRAN_SECURITE', '1.2.7'); // 2016-09-30
/*
* Documentation : http://www.spip.net/fr_article4200.html
// MSIE 6.0 est un botnet 99,9% du temps, on traite donc ce USER_AGENT comme un bot
. 'MSIE 6\.0|'
// UA plus cibles
- . '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|facebook|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
+ . '80legs|accoona|AltaVista|ASPSeek|Baidu|Charlotte|EC2LinkFinder|eStyle|flipboard|hootsuite|FunWebProducts|Google|Genieo|INA dlweb|InfegyAtlas|Java VM|LiteFinder|Lycos|MetaURI|Moreover|Rambler|Scooter|ScrubbyBloglines|Yahoo|Yeti'
. ',i', (string) $_SERVER['HTTP_USER_AGENT'])
);
if (isset($_REQUEST['transformer_xml']))
$ecran_securite_raison = "transformer_xml";
+/*
+ * Outils XML mal sécurisés again
+ */
+if (isset($_REQUEST['var_url']) and $_REQUEST['var_url'] and isset($_REQUEST['exec']) and $_REQUEST['exec']=='valider_xml'){
+ $url = trim($_REQUEST['var_url']);
+ if (strncmp($url,'/',1)==0
+ or (($p=strpos($url,'..'))!==false AND strpos($url,'..',$p+3)!==false)
+ or (strpos($url,'://')!==false or strpos($url,':\\')!==false)) {
+ $ecran_securite_raison = 'URL interdite pour var_url';
+ }
+}
+
/*
* Sauvegarde mal securisée < 2.0.9
*/
* id : id_rubrique fournit en second arg de #FORMULAIRE_INSCRIPTION
* from : email de l'envoyeur pour l'envoi du mail d'inscription
* force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base
+ * modele_mail : squelette de mail a utiliser
* @return array|string
*/
function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){
if (strlen($login_base) < 3)
$login_base = 'user';
- // eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
- if (strlen($login_base) > 10) {
- $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/",
- '\1', $login_base);
- $login_base = substr($login_base, 0,13);
- }
-
$login = $login_base;
for ($i = 1; ; $i++) {
$contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'email',$desc['email']);
$contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'jeton',$desc['jeton']);
- $message = recuperer_fond('modeles/mail_inscription',$contexte);
- $from = (isset($options['from'])?$options['from']:null);
+ $modele_mail = 'modeles/mail_inscription';
+ if (isset($options['modele_mail']) and $options['modele_mail']){
+ $modele_mail = $options['modele_mail'];
+ }
+ $message = recuperer_fond($modele_mail, $contexte);
+ $from = (isset($options['from']) ? $options['from'] : null);
$head = null;
return array("", $message,$from,$head);
}
*/
function auteur_effacer_jeton($id_auteur){
return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
-}
\ No newline at end of file
+}
* @param int $id
* @param int $id_rubrique
* @param string $changer_lang
+ * @param string $serveur
* @return string
*/
-function action_instituer_langue_objet_dist($objet,$id, $id_rubrique, $changer_lang) {
+function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang, $serveur='') {
if ($changer_lang) {
$table_objet_sql = table_objet_sql($objet);
$id_table_objet = id_table_objet($objet);
-
+ $trouver_table = charger_fonction('trouver_table', 'base');
+ $desc = $trouver_table($table_objet_sql, $serveur);
+
+ $set = array();
+ if (isset($desc['field']['langue_choisie'])){
+ $set['langue_choisie'] = 'oui';
+ }
+
if ($changer_lang != "herit") {
- sql_updateq($table_objet_sql, array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "$id_table_objet=".intval($id));
- include_spip('inc/rubriques');
- $langues = calculer_langues_utilisees();
+ $set['lang'] = $changer_lang;
+ sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur);
+ include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees
+ if ($table_objet_sql == 'spip_rubriques') {
+ calculer_langues_rubriques();
+ }
+ $langues = calculer_langues_utilisees($serveur);
ecrire_meta('langues_utilisees', $langues);
}
else {
$langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
if (!$langue_parent)
$langue_parent = $GLOBALS['meta']['langue_site'];
- sql_updateq($table_objet_sql, array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "$id_table_objet=".intval($id));
$changer_lang = $langue_parent;
+ $set['lang'] = $changer_lang;
+ if (isset($set['langue_choisie'])){
+ $set['langue_choisie'] = 'non';
+ }
+ sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur);
+ if ($table_objet_sql == 'spip_rubriques') {
+ include_spip('inc/rubriques');
+ calculer_langues_rubriques();
+ }
}
}
return $changer_lang;
// http://doc.spip.org/@exec_valider_xml_dist
function exec_valider_xml_dist()
{
- if (!autoriser('sauvegarder')) {
+ if (!autoriser('webmestre')) {
include_spip('inc/minipres');
echo minipres();
- } else valider_xml_ok(_request('var_url'), _request('ext'), intval(_request('limit')), _request('recur'));
+ } else {
+ $erreur = "";
+ // verifier que les var de l'URL sont conformes avant d'appeler la fonction
+ $url = trim(_request('var_url'));
+ if (strncmp($url,'/',1)==0) $erreur = 'Chemin absolu interdit pour var_url';
+ // on a pas le droit de remonter plus de 1 fois dans le path (pas 2 occurences de ../ ou ..\ (win))
+ if (($p=strpos($url,'..'))!==false AND strpos($url,'..',$p+3)!==false) $erreur = 'Interdit de remonter en dehors de la racine';
+ if (strpos($url,'://')!==false or strpos($url,':\\')!==false) $erreur = 'URL absolue interdite pour var_url';
+
+ $ext = trim(_request('ext'));
+ $ext = ltrim($ext,'.'); // precaution
+ if (preg_match('/\W/',$ext)) $erreur = 'Extension invalide';
+
+ // en GET var_url doit etre signee, en POST seule l'action est signee
+ // CSRF safe
+ $process = true;
+ if ($url){
+ include_spip('inc/securiser_action');
+ if ($_SERVER["REQUEST_METHOD"]=='POST'){
+ if (!$token = _request('var_token')
+ or !verifier_cle_action("valider_xml",$token)){
+ $process = false;
+ }
+ }
+ if ($_SERVER["REQUEST_METHOD"]!='POST'){
+ if (!$token = _request('var_token')
+ or !verifier_cle_action("valider_xml&var_url=$url",$token)){
+ $process = false;
+ }
+ }
+ }
+
+ if ($erreur){
+ include_spip('inc/minipres');
+ echo minipres($erreur);
+ }
+ else {
+ valider_xml_ok($url, $ext, intval(_request('limit')), _request('recur'), $process);
+ }
+ }
}
// http://doc.spip.org/@valider_xml_ok
-function valider_xml_ok($url, $req_ext, $limit, $rec)
-{
+function valider_xml_ok($url, $req_ext, $limit, $rec, $process = true) {
$url = urldecode($url);
$rec = !$rec ? false : array();
if (!$limit) $limit = 200;
$titre = _T('analyse_xml');
if (!$url) {
- $url_aff = 'http://';
- $onfocus = "this.value='';";
- $texte = $bandeau = $err = '';
+ $url_aff = '';
+ $bandeau = $err = '';
} else {
include_spip('inc/distant');
}
} else { $dir = 'exec'; $script = $url; $args = true;}
- $transformer_xml = charger_fonction('valider', 'xml');
- $onfocus = "this.value='" . addslashes($url) . "';";
- if (preg_match(',^[a-z][0-9a-z_]*$,i', $url)) {
- $res = $transformer_xml(charger_fonction($url, $dir), $args);
- $url_aff = valider_pseudo_url($dir, $script);
- } else {
- $res = $transformer_xml(recuperer_page($url));
- $url_aff = entites_html($url);
- }
- list($texte, $err) = emboite_texte($res);
- if (!$err) {
- $err = '<h3>' . _T('spip_conforme_dtd') . '</h3>';
+ $url_aff = entites_html($url);
+ $bandeau = "";
+ $res = "";
+ if ($process) {
+ $transformer_xml = charger_fonction('valider', 'xml');
+ if (preg_match(',^[a-z][0-9a-z_]*$,i', $url)) {
+ $res = $transformer_xml(charger_fonction($url, $dir), $args);
+ $url_aff = valider_pseudo_url($dir, $script);
+ } else {
+ $res = $transformer_xml(recuperer_page($url));
+ $url_aff = entites_html($url);
+ }
+ list($texte, $err) = emboite_texte($res);
+ if (!$err) {
+ $err = '<h3>' . _T('spip_conforme_dtd') . '</h3>';
+ }
+ $res =
+ "<div style='text-align: center'>" . $err . "</div>" .
+ "<div style='margin: 10px; text-align: left'>" . $texte . '</div>';
+ $bandeau = "<a href='$url_aff'>".$url_aff."</a>";
}
- $res =
- "<div style='text-align: center'>" . $err . "</div>" .
- "<div style='margin: 10px; text-align: left'>" . $texte . '</div>';
- $bandeau = "<a href='$url_aff'>$url</a>";
}
}
$debut = $commencer_page($titre);
$jq = http_script("", 'jquery.js');
+
echo str_replace('<head>', "<head>$jq", $debut);
- $onfocus = '<input type="text" size="70" value="' .$url_aff .'" name="var_url" id="var_url" onfocus="'.$onfocus . '" />';
- $onfocus = generer_form_ecrire('valider_xml', $onfocus, " method='get'");
+ include_spip('inc/securiser_action');
+ $token = calculer_cle_action("valider_xml");
+ $texte = '<input type="text" size="70" value="' . $url_aff . '" name="var_url" id="var_url" placeholder="http://" />';
+ $texte .= '<input type="hidden" value="' . $token . '" name="var_token" />';
+ $texte .= '<input type="hidden" value="' . $req_ext . '" name="ext" />';
+ $texte .= '<input type="submit" value="Go" />';
+ $texte = generer_form_ecrire('valider_xml', $texte, " method='post'");
+
+ $self = generer_url_ecrire('valider_xml');
+ $self = parametre_url($self, 'var_url', $url);
+ $self = parametre_url($self, 'ext', $req_ext);
+ $self = parametre_url($self, 'limit', $limit);
+ $self = parametre_url($self, 'rec', $rec);
+ $self = "<a href='$self'>$self</a>";
- echo "<h1>", $titre, '<br>', $bandeau, '</h1>',
- "<div style='text-align: center'>", $onfocus, "</div>",
+ echo "<h1 class='grostitre'>", $titre, " <small>$bandeau</small>", '</h1>',
+ "<div style='text-align: center'>", $texte, "</div>",
$res,
+ "<br /><br /><p><small>$self</small></p>",
fin_page();
}
// http://doc.spip.org/@valider_resultats
function valider_resultats($res, $mode)
{
+ include_spip('inc/securiser_action');
$i = $j = 0;
$table = '';
rsort($res);
($erreurs[0][0] . ' ' . _T('ligne') . ' ' .
$erreurs[0][1] .($nb==1? '': ' ...'));
if ($err) $j++;
- $h = $mode
- ? ($appel . '&var_mode=debug&var_mode_affiche=validation')
- : generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
-
+ if ($mode) {
+ $h = $appel . '&var_mode=debug&var_mode_affiche=validation';
+ }
+ else {
+ $h = generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel));
+ $h = parametre_url($h,'var_token', calculer_cle_action("valider_xml&var_url=$appel"));
+ }
+
$table .= "<tr class='$class'>"
. "<td style='text-align: right'>$nb</td>"
. "<td style='text-align: right$color'>$texte</td>"
if ($auth = charger_fonction($auth_methode,'auth',true)
AND function_exists($f="auth_{$auth_methode}_$fonction")
)
- return call_user_func_array($f, $args);
+ $res = call_user_func_array($f, $args);
else
- return $defaut;
+ $res = $defaut;
+ $res = pipeline('auth_administrer',array(
+ 'args' => array(
+ 'fonction' => $fonction,
+ 'methode' => $auth_methode,
+ 'args' => $args
+ ),
+ 'data' => $res
+ ));
+ return $res;
}
/**
// http://doc.spip.org/@recuperer_infos_distantes
function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true){
+ // pas la peine de perdre son temps
+ if (!tester_url_absolue($source)) {
+ return false;
+ }
+
# charger les alias des types mime
include_spip('base/typedoc');
global $mime_alias;
$a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
}
+ // si on a rien trouve pas la peine d'insister
+ if (!$a) {
+ return false;
+ }
+
// S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
// recharger le document en GET et recuperer des donnees supplementaires...
if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)){
$r = self();
$r = ' data-origin="'.$r.'"';
$class = 'ajaxbloc';
- if ($ajaxid AND is_string($ajaxid)){
- $class .= ' ajax-id-'.$ajaxid;
+ if ($ajaxid and is_string($ajaxid)) {
+ // ajaxid est normalement conforme a un nom de classe css
+ // on ne verifie pas la conformite, mais on passe entites_html par dessus par precaution
+ $class .= ' ajax-id-' . entites_html($ajaxid);
}
return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n";
}
if (!isset($GLOBALS['meta']['langue_site'])) {
// Initialisation : le francais si dispo, sinon la premiere langue trouvee
$GLOBALS['meta']['langue_site'] = $tout =
- (!$all_langs OR (strpos(',fr,',",$all_langs,")!==false))
- ? 'fr' : substr($all_langs,0,strpos($all_langs,','));
+ (!$all_langs OR (strpos(','._LANGUE_PAR_DEFAUT.',',",$all_langs,")!==false))
+ ? _LANGUE_PAR_DEFAUT : substr($all_langs,0,strpos($all_langs,','));
ecrire_meta('langue_site', $tout);
}
}
$statut = isset($GLOBALS['visiteur_session']['statut']) ? $GLOBALS['visiteur_session']['statut'] : '';
$nom = isset($GLOBALS['visiteur_session']['nom']) ? $GLOBALS['visiteur_session']['nom'] : '';
+ if ($statut != '0minirezo') {
+ $titre = _T('info_acces_interdit');
+ }
+
$corps = generer_form_ecrire('accueil', '','',
$statut ? _T('public:accueil_site') : _T('public:lien_connecter')
);
$parent = ($objet=='rubrique')?'id_parent':'id_rubrique';
$id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet));
}
- $instituer_langue_objet = charger_fonction('instituer_langue_objet','action');
- $champs['lang'] = $instituer_langue_objet($objet,$id_objet, $id_rubrique, $changer_lang);
+ $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action');
+ $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang, $serveur);
}
// on laisse 'lang' dans $champs,
// ca permet de passer dans le pipeline post_edition et de journaliser
OR !isset($_SERVER['HTTP_REFERER'])))
return $texte;
include_spip('inc/surligne');
+ if (isset($_SERVER['HTTP_REFERER'])) {
+ $_SERVER['HTTP_REFERER'] = preg_replace(',[^\w\,/#&;-]+,', ' ', $_SERVER['HTTP_REFERER']);
+ }
+ if ($rech){
+ $rech = preg_replace(',[^\w\,/#&;-]+,', ' ', $rech);
+ }
+
return surligner_mots($texte, $rech);
}
$recherche = trim($recherche);
$is_preg = false;
- if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){
+ if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/' and strlen($recherche) > 2) {
// c'est une preg
$recherche_trans = translitteration($recherche);
$preg = $recherche_trans.$options['preg_flags'];
// var liee a la langue
$l = $GLOBALS['meta']['langue_site'];
if (!$fichiers_lang = chercher_module_lang($module, $l))
- $fichiers_lang = chercher_module_lang($module, 'fr');
+ $fichiers_lang = chercher_module_lang($module, _LANGUE_PAR_DEFAUT);
if ($fichiers_lang) {
$GLOBALS['idx_lang']='i18n_'.$module.'_' .$l;
// on essaie d'abord la langue du site, puis a defaut la langue fr
$langue_retenue = $lang;
if (!strlen($text)
- AND $lang !== 'fr') {
+ AND $lang !== _LANGUE_PAR_DEFAUT) {
if ($lang !== $GLOBALS['meta']['langue_site']) {
$text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']);
$langue_retenue = (!strlen($text) ? $GLOBALS['meta']['langue_site'] : '');
}
else {
- $text = inc_traduire_dist($ori, 'fr');
- $langue_retenue = (!strlen($text) ? 'fr' : '');
+ $text = inc_traduire_dist($ori, _LANGUE_PAR_DEFAUT);
+ $langue_retenue = (!strlen($text) ? _LANGUE_PAR_DEFAUT : '');
}
}
if (!preg_match(',^\w+$,', $f)){
if ($continue) return false; //appel interne, on passe
- die(spip_htmlspecialchars($nom)." pas autorise");
+ include_spip('inc/minipres');
+ echo minipres();
+ exit;
}
// passer en minuscules (cf les balises de formulaires)
include_spip('inc/minipres');
echo minipres(_T('forum_titre_erreur'),
- _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')));
+ _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>')),
+ array('all_inline'=>true,'status'=>404));
exit;
}
/**
- * Tester si une url est absolue
- * @param $url
+ * Tester si une URL est absolue
+ *
+ * On est sur le web, on exclut certains protocoles,
+ * notamment 'file://', 'php://' et d'autres…
+
+ * @param string $url
* @return bool
*/
-function tester_url_absolue($url){
- return preg_match(";^([a-z]+:)?//;Uims",trim($url))?true:false;
+function tester_url_absolue($url) {
+ $url = trim($url);
+ if (preg_match(";^([a-z]{3,7}:)?//;Uims", $url, $m)) {
+ if (
+ isset($m[1])
+ and $p = strtolower(rtrim($m[1], ':'))
+ and in_array($p, array('file', 'php', 'zlib', 'glob', 'phar', 'ssh2', 'rar', 'ogg', 'expect', 'zip'))
+ ) {
+ return false;
+ }
+ return true;
+ }
+ return false;
}
/**
$themes = array(_SPIP_THEME_PRIVE);
// lors d'une installation neuve, prefs n'est pas definie.
if (isset($GLOBALS['visiteur_session']['prefs'])) {
- $prefs = isset($GLOBALS['visiteur_session']['prefs']);
+ $prefs = $GLOBALS['visiteur_session']['prefs'];
} else {
$prefs = array();
}
$prof = max($prof,0);
$myself = ltrim($request,'/');
+ // vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
+ // protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
+ if (strpos($myself,'://') !== false) {
+ $myself = explode('://',$myself);
+ array_shift($myself);
+ $myself = implode('://',$myself);
+ $myself = explode('/',$myself);
+ array_shift($myself);
+ $myself = implode('/',$myself);
+ }
# supprimer la chaine de GET
list($myself) = explode('?', $myself);
$url = join('/', array_slice(explode('/', $myself), 0, -1-$prof)).'/';
#if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite
}
+ // Langue par defaut
+ if (!defined('_LANGUE_PAR_DEFAUT')) define('_LANGUE_PAR_DEFAUT','fr');
+
// PHP_VERSION_ID dispo depuis PHP 5.2.7
if (!defined('PHP_VERSION_ID')) {
$version = explode('.',PHP_VERSION);
// pour specifier les versions de SPIP necessaires
// il faut s'en tenir a un nombre de decimales fixe
// ex : 2.0.0, 2.0.0-dev, 2.0.0-beta, 2.0.0-beta2
-$spip_version_branche = "3.0.22";
+$spip_version_branche = "3.0.24";
// version des signatures de fonctions PHP
// (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
$spip_version_code = 17873;
traiter_formulaires_dynamiques())
exit; // le hit est fini !
}
+// securiser les redirect du back-office
+if (_request('redirect')) {
+ if (!function_exists('securiser_redirect_action')){
+ include_spip('public/aiguiller');
+ }
+ set_request('redirect',securiser_redirect_action(_request('redirect')));
+}
+
//
// Gestion d'une page normale de l'espace prive
<paquet
prefix="spip"
categorie="outil"
- version="3.0.22"
+ version="3.0.24"
etat="stable"
compatibilite="];["
schema="19268"
documentation="http://www.spip.net"
demonstration="http://demo.spip.net"
developpement="http://core.spip.org/projects/spip/"
->
+>
<nom>SPIP</nom>
<!-- Système de publication pour l'Internet -->
<pipeline nom="affiche_formulaire_login" action="auth_formulaire_login" inclure="inc/pipelines.php" />
<pipeline nom="alertes_auteur" action="" />
<pipeline nom="arbo_creer_chaine_url" action="" />
+ <pipeline nom="auth_administrer" action="" />
<pipeline nom="autoriser" action="" />
<pipeline nom="base_admin_repair" action="" />
<pipeline nom="boite_infos" action="f_boite_infos" inclure="inc/pipelines_ecrire.php" />
if (!defined('_ECRIRE_INC_VERSION')) return;
-function securiser_redirect_action($redirect){
- if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')){
+function securiser_redirect_action($redirect) {
+ if ((tester_url_absolue($redirect) or preg_match(',^\w+:,',trim($redirect)))
+ and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
// si l'url est une url du site, on la laisse passer sans rien faire
// c'est encore le plus simple
$base = $GLOBALS['meta']['adresse_site']."/";
$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
if (is_string($p->texte)) {
$fichier = $p->texte;
- $code = "\"$fichier\"";
+ $code = "\"".str_replace('"','\"',$fichier)."\"";
} else {
$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
}
// s'il y a une extension .php, ce n'est pas un squelette
- if (preg_match('/^.+[.]php$/s', $fichier)) {
+ if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
} else {
$_options[] = "\"compil\"=>array($compil)";
. join(', ', $infos)
.' ('.strlen($page['texte']).' octets)');
+ if (defined('_CALCUL_PROFILER') AND intval($profile)>_CALCUL_PROFILER){
+ spip_log("calcul ($profile) [$skel] "
+ . join(', ', $infos)
+ .' ('.strlen($page['texte']).' octets) | '.$_SERVER['REQUEST_URI'],"profiler"._LOG_AVERTISSEMENT);
+ }
+
if ($debug) {
// si c'est ce que demande le debusqueur, lui passer la main
$t = strlen($page['texte']) ? $page['texte'] : " ";
// Si #CACHE{} n'etait pas la, le mettre a $delais
if (!isset($page['entetes']['X-Spip-Cache'])){
// Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut
- // si aucun #CACHE{} spécifié
+ // si aucun #CACHE{} specifie
// le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme
// entre public et prive
if (test_espace_prive() OR strncmp($fond,'modeles/',8)==0)
if (defined('_DEBUG_SLOW_QUERIES') AND _DEBUG_SLOW_QUERIES){
if(isset($GLOBALS['debug']['aucasou'])){
list(,$id,, $infos) = $GLOBALS['debug']['aucasou'];
- $debug .= " BOUCLE$id @ ".$infos[0] ." | ";
+ $debug .= "BOUCLE$id @ ".$infos[0] ." | ";
}
- $debug .= " " . $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
- $debug = ' /*'.str_replace('*/','@/',$debug).' */';
+ $debug .= $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip'];
+ $debug = ' /* '. mysql_real_escape_string(str_replace('*/','@/',$debug)). ' */';
}
$r = $link ? mysql_query($query.$debug, $link) : mysql_query($query.$debug);
<br class="clear" />
<script type="text/javascript">/*<![CDATA[*/
if (window.jQuery){ jQuery(function(){
- jQuery(window).unload(function() { alert('<:forum:forum_attention_message_non_poste|texte_script:>');jQuery(window).unbind();});
- jQuery(window).on('beforeunload', function(){ jQuery(window).unbind();return '<:forum:forum_attention_message_non_poste|texte_script:>'; });
+ var confirm_quit = true;
+ jQuery(window).unload(function() { if (confirm_quit) alert('<:forum:forum_attention_message_non_poste|texte_script:>');jQuery(window).unbind();});
+ jQuery(window).on('beforeunload', function(e){ jQuery(window).unbind();if (!confirm_quit) return;e.returnValue='<:forum:forum_attention_message_non_poste|texte_script:>';return e.returnValue; });
+ jQuery('fieldset.previsu').closest('form').next('form').bind('submit',function(){
+ confirm_quit=false;
+ });
});}
/*]]>*/</script>
\ No newline at end of file
}
else if ($t['statut'] == 'publie') # forum publie
{
- $url = generer_url_entite($id_forum, 'forum');
+ $url = generer_url_entite($id_forum, 'forum', '', 'forum'.$id_forum, true);
}
else # forum modere, spam, poubelle direct ....
{
<paquet
prefix="forum"
categorie="communication"
- version="1.8.41"
+ version="1.8.43"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/forum-32.png"
include_spip('inc/modifier');
if (isset($file['distant']) AND $file['distant'] AND !in_array($mode,array('choix','auto','image','document'))) {
+ spip_log("document distant $source accepte sans verification, mode=$mode","medias"._LOG_INFO_IMPORTANTE);
include_spip('inc/distant');
$file['tmp_name'] = _DIR_RACINE . copie_locale($source);
$source = $file['tmp_name'];
// via une requete HEAD pour savoir si la ressource existe (non 404), si le
// content-type est connu, et si possible recuperer la taille, voire plus.
if (isset($file['distant']) AND $file['distant']) {
+ if (!tester_url_absolue($source)){
+ return _T('medias:erreur_chemin_distant', array('nom' => $source));
+ }
include_spip('inc/distant');
if (is_array($a = renseigner_source_distante($source))) {
$row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document=$id_document");
$source = $row['fichier'];
- include_spip('inc/distant'); // pour 'copie_locale'
- $fichier = copie_locale($source);
- if ($fichier) {
- $fichier = _DIR_RACINE . $fichier;
- $files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier));
- $ajouter_documents = charger_fonction('ajouter_documents','action');
- spip_log("convertit doc $id_document en local: $source => $fichier");
- $liste = array();
- $ajouter_documents($id_document,$files,'',0,$row['mode'],$liste);
-
- spip_unlink($fichier);
-
- // ajouter l'origine du document aux credits
- include_spip('action/editer_document');
- document_modifier($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source));
- return true;
-
+ // si la source est bien un fichier distant
+ // sinon c'est une donnee moisie, on ne fait rien
+ if (tester_url_absolue($source)){
+
+ include_spip('inc/distant'); // pour 'copie_locale'
+ $fichier = copie_locale($source);
+ if ($fichier) {
+ $fichier = _DIR_RACINE . $fichier;
+ $files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier));
+ $ajouter_documents = charger_fonction('ajouter_documents','action');
+ spip_log("convertit doc $id_document en local: $source => $fichier");
+ $liste = array();
+ $ajouter_documents($id_document,$files,'',0,$row['mode'],$liste);
+
+ spip_unlink($fichier);
+
+ // ajouter l'origine du document aux credits
+ include_spip('action/editer_document');
+ document_modifier($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source));
+ return true;
+
+ } else {
+ spip_log("echec copie locale $source");
+ }
} else {
- spip_log("echec copie locale $source");
+ spip_log("echec copie locale $source n'est pas une URL distante", "medias" . _LOG_ERREUR);
}
+
return _T('medias:erreur_copie_fichier',array('nom'=>$source));
}
if ($champs['fichier'] // un plugin a pu interdire la modif du fichier en virant le champ
AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
+ AND !tester_url_absolue($ancien_fichier)
AND @file_exists($f = get_spip_doc($ancien_fichier)))
spip_unlink($f);
else {
// liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom
if ($ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document))
+ AND !tester_url_absolue($ancien_fichier)
AND @file_exists($rename = get_spip_doc($ancien_fichier))){
@rename($rename,"$rename--.old");
AND !_request('joindre_zip')\r
AND $contenu_zip = joindre_verifier_zip($files)){\r
list($fichiers,$erreurs,$tmp_zip) = $contenu_zip;\r
- if ($fichiers)\r
- $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$tmp_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs));\r
+ if ($fichiers){\r
+ // on passe le md5 du fichier uniquement, on le retrouvera dans zip_to_clean de la session\r
+ $token_zip = md5($tmp_zip);\r
+ $erreurs['lister_contenu_archive'] = recuperer_fond("formulaires/inc-lister_archive_jointe",array('chemin_zip'=>$token_zip,'liste_fichiers_zip'=>$fichiers,'erreurs_fichier_zip'=>$erreurs));\r
+ }\r
else\r
$erreurs['message_erreur'] = _T('medias:erreur_aucun_fichier'); \r
}\r
return $files;\r
}\r
}\r
- elseif (_request('joindre_zip') AND $path = _request('chemin_zip')){\r
+ elseif (_request('joindre_zip') and $token_zip = _request('chemin_zip')) {\r
+\r
+ $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ? unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array());\r
+ if (!$zip_to_clean or !isset($zip_to_clean[$token_zip]) or !$path = $zip_to_clean[$token_zip]){\r
+ return _T('avis_operation_impossible');\r
+ }\r
+\r
include_spip('inc/documents'); //pour creer_repertoire_documents\r
define('_tmp_zip', $path);\r
define('_tmp_dir', creer_repertoire_documents(md5($path.$GLOBALS['visiteur_session']['id_auteur'])));\r
// Est-ce qu'on sait le lire ?\r
include_spip('inc/pclzip');\r
if ($zip\r
- AND $archive = new PclZip($zip)\r
- AND $contenu = joindre_decrire_contenu_zip($archive)\r
- AND rename($zip, $tmp = _DIR_TMP.basename($zip))\r
- ){\r
+ AND $archive = new PclZip($zip)\r
+ AND $contenu = joindre_decrire_contenu_zip($archive)\r
+ AND $tmp = sous_repertoire(_DIR_TMP,"zip")\r
+ AND rename($zip, $tmp = $tmp.basename($zip))\r
+ ){\r
+ $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean'])?unserialize($GLOBALS['visiteur_session']['zip_to_clean']):array());\r
+ $zip_to_clean[md5($tmp)] = $tmp;\r
+ session_set('zip_to_clean',serialize($zip_to_clean));\r
$contenu[] = $tmp;\r
return $contenu;\r
}\r
if (!defined('_ECRIRE_INC_VERSION')) return;
+// nettoyer les zip abandonnes par l'utilisateur
+if (isset($GLOBALS['visiteur_session']['zip_to_clean'])
+ AND test_espace_prive()
+ AND $_SERVER['REQUEST_METHOD']!=='POST'){
+ $zip_to_clean = unserialize($GLOBALS['visiteur_session']['zip_to_clean']);
+ if ($zip_to_clean){
+ foreach ($zip_to_clean as $zip){
+ if (@file_exists($zip))
+ @unlink($zip);
+ }
+ }
+ session_set('zip_to_clean');
+}
/**
* Afficher la puce de statut pour les documents
<paquet
prefix="medias"
categorie="multimedia"
- version="2.7.66"
+ version="2.7.70"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/portfolio-32.png"
onAjaxLoad(reload_chemin);
});
</script>
-#PIPELINE{afficher_contenu_objet,#ARRAY{args,#ARRAY{type,document,id_objet,#ID_DOCUMENT},data,''}}
\ No newline at end of file
+<!--affiche_milieu-->
+#PIPELINE{afficher_contenu_objet,#ARRAY{args,#ARRAY{type,document,id_objet,#ID_DOCUMENT},data,''}}
if (!count($items)) return _T('sites:avis_echec_syndication_01');
+ if (!defined('_SYNDICATION_MAX_ITEMS')) define('_SYNDICATION_MAX_ITEMS',1000);
+ $nb_items = 0;
foreach ($items as $item) {
$data = array();
+ if ($nb_items++>_SYNDICATION_MAX_ITEMS){
+ break;
+ }
// URL (semi-obligatoire, sert de cle)
if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss,
$regs, PREG_SET_ORDER)) {
foreach ($regs as $n => $reg) {
- if (preg_match(',[<>],', $reg[1])) {
- $echappe_cdata[$n] = $reg[1];
- $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
+ if (strpos($reg[1],'<')!==false
+ or strpos($reg[1],'>')!==false) {
+ // verifier que la chaine est encore dans le flux, car on peut avoir X fois la meme
+ // inutile de (sur)peupler le tableau avec des substitutions identiques
+ if (strpos($rss,$reg[0])!==false){
+ $echappe_cdata["@@@SPIP_CDATA$n@@@"] = $reg[1];
+ $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss);
+ }
} else
$rss = str_replace($reg[0], $reg[1], $rss);
}
// http://code.spip.net/@cdata_echappe_retour
function cdata_echappe_retour(&$x, &$echappe_cdata) {
if (is_string($x)) {
- if (strpos($x, '@@@SPIP_CDATA') !== false
- OR strpos($x, '<') !== false) {
+ if (strpos($x, '<') !== false){
$x = filtrer_entites($x);
- foreach ($echappe_cdata as $n => $e)
- $x = str_replace("@@@SPIP_CDATA$n@@@", $e, $x);
+ }
+ if (strpos($x, '@@@SPIP_CDATA') !== false){
+ $x = str_replace( array_keys($echappe_cdata), array_values($echappe_cdata), $x);
}
}
<paquet
prefix="sites"
categorie="edition"
- version="1.7.19"
+ version="1.7.20"
etat="stable"
compatibilite="[3.0.0;3.0.*]"
logo="prive/themes/spip/images/site-32.png"
}
}
- if (preg_match(",^\s*javascript,i", _request('url_site'))) {
+ if ($url = _request('url_site') and !tester_url_absolue($url)) {
$erreurs['url_site'] = _T('info_url_site_pas_conforme');
}
.formulaire_spip li label,
.formulaire_spip li.gauche label {
- color: #4444;
+ color: #444;
width: 114px;
float:#ENV{left};
margin-#ENV{left}:-130px;
include_spip('action/inscrire_auteur');
$cookie = auteur_attribuer_jeton($r[1]['id_auteur']);
+ // l'url_reset doit etre une URL de confiance, on force donc un url_absolue sur adresse_site
+ include_spip('inc/filtres');
$msg = recuperer_fond(
"modeles/mail_oubli",
array(
- 'url_reset'=>generer_url_public('spip_pass',"$param=$cookie", true, false)
+ 'url_reset' => url_absolue(generer_url_public('spip_pass', "$param=$cookie"),$GLOBALS['meta']['adresse_site'])
)
);
include_spip("inc/notifications");
<BOUCLE_un_article(ARTICLES){id_article}>
<item[ xml:lang="(#LANG)"]>
<title>[(#TITRE|supprimer_tags|texte_backend)]</title>
- <link>[(#URL_ARTICLE|url_absolue|texte_backend)]</link>
+ <link>[(#URL_ARTICLE|url_absolue)]</link>
[<guid isPermaLink="true">(#URL_ARTICLE|url_absolue|texte_backend)</guid>]
[<dc:date>(#DATE|date_iso)</dc:date>]
<dc:format>text/html</dc:format>
sous forme de "microformats"
]<BOUCLE_rubrique_mf(RUBRIQUES){id_rubrique}>-
-[<a href="[(#URL_RUBRIQUE|url_absolue|texte_backend)]" rel="directory">(#TITRE|supprimer_tags|texte_backend)</a>]
+[<a href="[(#URL_RUBRIQUE|url_absolue)]" rel="directory">(#TITRE|supprimer_tags|texte_backend)</a>]
</BOUCLE_rubrique_mf><B_mots_mf>
/ <BOUCLE_mots_mf(MOTS){id_article}{", "}>
-[<a href="[(#URL_MOT|url_absolue|texte_backend)]" rel="tag">(#TITRE|texte_backend)</a>]</BOUCLE_mots_mf>
+[<a href="[(#URL_MOT|url_absolue)]" rel="tag">(#TITRE|texte_backend)</a>]</BOUCLE_mots_mf>
</description>
][<div class='rss_chapo'>(#CHAPO|texte_backend)</div>
][<div class='rss_texte'>(#TEXTE|
image_reduire{500,0}|texte_backend)</div>
- ][<div class="hyperlien"><:voir_en_ligne|html2unicode:> : <a href="(#URL_SITE|texte_backend)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]}|texte_backend)]</a></div>
+ ][<div class="hyperlien"><:voir_en_ligne|html2unicode:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]}|texte_backend)]</a></div>
][<hr />
<div class='rss_notes'>(#NOTES|texte_backend)</div>
][<div class='rss_ps'>(#PS|texte_backend)</div>]
Le bloc qui suit diffuse l'adresse des documents associes aux articles ;
ajouter par ex. {extension=mp3} pour limiter a un certain type de document.
] <BOUCLE_documents(DOCUMENTS){id_article}{mode=document}{doublons}>[
- <enclosure url="(#URL_DOCUMENT|url_absolue|texte_backend|unique)"[ length="(#TAILLE)"][ type="(#MIME_TYPE)"] />]
+ <enclosure url="(#URL_DOCUMENT|url_absolue|unique)"[ length="(#TAILLE)"][ type="(#MIME_TYPE)"] />]
</BOUCLE_documents>
</item>
<svn_revision>
<text_version>
-Origine: svn://trac.rezo.net/spip/tags/spip-3.0.22
-Revision: 22914
-Dernier commit: 2016-03-10 15:00:32 +0100
+Origine: svn://trac.rezo.net/spip/tags/spip-3.0.24
+Revision: 23212
+Dernier commit: 2016-09-30 23:13:21 +0200
</text_version>
-<origine>svn://trac.rezo.net/spip/tags/spip-3.0.22</origine>
-<revision>22914</revision>
-<commit>2016-03-10 15:00:32 +0100 </commit>
+<origine>svn://trac.rezo.net/spip/tags/spip-3.0.24</origine>
+<revision>23212</revision>
+<commit>2016-09-30 23:13:21 +0200 </commit>
</svn_revision>
\ No newline at end of file