~maj v3.0.19-->v3.0.21
authorLudovic CHEVALIER <ludovic@beurresarrasin.net>
Mon, 21 Dec 2015 18:30:07 +0000 (19:30 +0100)
committerLudovic CHEVALIER <ludovic@beurresarrasin.net>
Mon, 21 Dec 2015 18:30:07 +0000 (19:30 +0100)
72 files changed:
www/CHANGELOG.txt
www/ecrire/action/desinstaller_plugin.php
www/ecrire/base/connect_sql.php
www/ecrire/base/create.php
www/ecrire/inc/cvt_autosave.php
www/ecrire/inc/editer.php
www/ecrire/inc/filtres_images_lib_mini.php
www/ecrire/inc/filtres_mini.php
www/ecrire/inc/flock.php
www/ecrire/inc/invalideur.php
www/ecrire/inc/lang_liste.php
www/ecrire/inc/lien.php
www/ecrire/inc/plugin.php
www/ecrire/inc/puce_statut.php
www/ecrire/inc/texte.php
www/ecrire/inc/texte_mini.php
www/ecrire/inc/utils.php
www/ecrire/inc_version.php
www/ecrire/paquet.xml
www/ecrire/public/assembler.php
www/ecrire/public/compiler.php
www/ecrire/public/composer.php
www/ecrire/public/phraser_html.php
www/plugins-dist/forum/action/editer_forum.php
www/plugins-dist/forum/formulaires/forum.html
www/plugins-dist/forum/forum_autoriser.php
www/plugins-dist/forum/paquet.xml
www/plugins-dist/medias/medias_autoriser.php
www/plugins-dist/medias/paquet.xml
www/plugins-dist/mots/base/mots.php
www/plugins-dist/mots/formulaires/editer_mot.php
www/plugins-dist/mots/paquet.xml
www/plugins-dist/mots/prive/squelettes/contenu/mot_edit.html
www/plugins-dist/mots/prive/squelettes/contenu/mots.html
www/plugins-dist/organiseur/organiseur_administrations.php
www/plugins-dist/organiseur/paquet.xml
www/plugins-dist/petitions/formulaires/signature.php
www/plugins-dist/porte_plume/css/barre_outils.css
www/plugins-dist/porte_plume/javascript/jquery.previsu_spip.js
www/plugins-dist/porte_plume/paquet.xml
www/plugins-dist/revisions/inc/revisions.php
www/plugins-dist/revisions/paquet.xml
www/plugins-dist/revisions/prive/squelettes/contenu/revision.html
www/plugins-dist/safehtml/inc/safehtml.php
www/plugins-dist/sites/genie/syndic.php
www/plugins-dist/sites/inc/syndic.php
www/plugins-dist/sites/paquet.xml
www/plugins-dist/statistiques/engines-list.txt
www/plugins-dist/statistiques/genie/popularites.php
www/plugins-dist/statistiques/genie/visites.php
www/plugins-dist/statistiques/paquet.xml
www/plugins-dist/statistiques/prive/style_prive_plugin_stats.html
www/plugins-dist/statistiques/public/stats.php
www/plugins-dist/svp/inc/svp_decider.php
www/plugins-dist/svp/inc/svp_depoter_distant.php
www/plugins-dist/svp/inc/svp_depoter_local.php
www/plugins-dist/svp/paquet.xml
www/plugins-dist/textwheel/inc/lien.php
www/plugins-dist/urls_etendues/paquet.xml
www/plugins-dist/urls_etendues/urls/propres.php
www/prive/formulaires/dater.html
www/prive/formulaires/dater.php
www/prive/javascript/ajaxCallback.js
www/prive/javascript/jquery.autosave.js
www/prive/objets/liste/articles-trad.html
www/prive/objets/liste/articles.html
www/prive/squelettes/ajax.html
www/prive/squelettes/head/dist.html
www/prive/squelettes/structure.html
www/prive/themes/spip/minipres.css
www/squelettes-dist/robots.txt.html
www/svn.revision

index 2923a02..392f76d 100644 (file)
@@ -1,7 +1,89 @@
 
-SPIP-Core spip-3.0.17 -> spip-3.0.19  08 mai 2015
+SPIP-Core spip-3.0.20 -> spip-3.0.21  31 octobre 2015
+-------------------------------------------------------------
+
+r22267 | cedric    |  (mer. 24 juin 2015) | Quand la source image est dans IMG/ et contient une query-string complexe et que le fichier existe sans la query-string, on l'ignore. Repare le traitement des images qui ont une URL restreinte basee sur la query-string+htaccess
+r22282 | fil       |  (lun. 29 juin 2015) | report de #22281 (https://core.spip.net/issues/3456)
+r22315 | cedric    |  (lun. 20 juil. 2015) | Reparer la desinstallation des plugins dans _DIR_PLUGINS_SUPPL
+r22326 | cedric    |  (ven. 24 juil. 2015) | Report de r22325 : Fix #3504 : purge des autosave cvt en session
+r22327 | cedric    |  (ven. 24 juil. 2015) | Report de r21817 : 0 est une valeur acceptable pour un champ obligatoire (Frederic, Pierretux)
+r22342 | cedric    |  (sam. 25 juil. 2015) | Fix #3510 : parametre_url sur les arguments de type tableau. On backporte la version du trunk 3.1 sur laquelle le bug a ete corrige
+r22344 | cedric    |  (dim. 26 juil. 2015) | Report de r22343 : Fix #3494 : quand la date de redaction anterieure est utilisee, il faut pouvoir l'editer sur un article en cours de redaction, comme avant, mais sans permettre l'edition de la date.On robustifie traiter() en verifiant le droit a edition qui a ete calcule dans charger() avant de prendre en compte les request, ce qui evite tout risque de manipulation du form et d'injection d'input en html+ Report de r22338 au passage
+r22362 | kent1     |  (mar. 28 juil. 2015) | Récupérer le title et le hreflang du lien entourant un modèle cf #3516
+r22384 | kent1     |  (mer. 12 août 2015) | Gros bug sur r22282 (cf #3456)Le passage en liens absolus se faisait uniquement sur le premier href ou src, remplaçant le premier href ou src par le dernier href / src présent dans le texte...On ne remplaçait plus lien par lien
+r22392 | erational |  (mar. 25 août 2015) | report de c22360
+r22393 | erational |  (mar. 25 août 2015) | arménien en code HTML
+r22402 | rasta     |  (jeu. 03 sept. 2015) | RAH. On corrige enfin ce fichu gros bug du compilateur qui faisait qu'on ne pouvait pas avoir un critère conditionnel ET plusieurs arguments.Ça marchait pour les critères sans arguments ou avec un seul argument.La raison ? Non-factorisation et doublonnage de code : actuellement, les critères mêmes persos (pas juste les trucs SQL) qui ont 0 ou 1 arguments, ne passent PAS par le même code que ceux avec 2 ou plus. Alors qu'ensuite le traitement et la regex associée sont quasiment les mêmes… mais pas tout à fait, puisque dans le cas 2 ou plus ça ne cherchait pas le "?".Pour l'instant on corrige juste le bug, mais il faudrait nettoyer le code et factoriser pour ne plus générer d'erreur de ce genre…Au passage, pour SPIP 3.0, on backport la correction du "_" manquant qui faisait, là aussi qu'avec 2 arguments ou plus, on avait pas le droit d'avoir des critères avec_plusieurs_mots, alors qu'on peut avec 0 ou 1 argument. Même raison : code fait deux fois différemment, dont la regex.
+r22434 | erational |  (ven. 16 oct. 2015) | pas d'accent sur Kreyòl (Peyi Dayiti)
+r22436 | cedric    |  (lun. 19 oct. 2015) | On ajoute l'heure de publication au survol de la date, cela est utile pour faire de la programmation intensive d'article a l'avance
+r22442 | cedric    |  (mar. 27 oct. 2015) | Report de r22441 : r17234 a introduit un include_spip() au debut de base/connect_sql.php, ce qui etait une erreur car ce fichier est inclus par inc_version avant toute initialisation du core et chargement des caches.Du coup chaque hit provoquait une invalidation du chemin car find_in_path appele trop tot croyait que son find etait nouveau, donc le hit se finissait par une ecriture du fichier tmp/cache/chemin.txt.Comme ce fichier peut etre assez gros (>100ko) et ecrit en posant un verrou, cela impactait la performance par un debit d'ecriture sur le disque et des possibles attentes entre hit concourants.Bug repere par nicod en 3.0 et confirme par RealET en 3.1
+r22444 | cedric    |  (mar. 27 oct. 2015) | Report de r22443 : Complement a r22441 : ne pas lever le flag en cas de find_in_path appele trop tot si le fichier n'est pas trouve
+r22449 | cedric    |  (jeu. 29 oct. 2015) | Report de r22427 : #3371 Les squelettes de l'espace prive recoivent un flag espace_prive=1 a toute fin utile
+r22450 | cedric    |  (jeu. 29 oct. 2015) | Report de r22428 : Fix #3371 : dans la fonction typo, si un flag espace_prive=1 est present dans le env, on echappe tout html suspect, ie qui ne passe pas a travers safehtml sans censure. Pour limiter l'impact perfo on conditionne l'echappement a la presence des caracteres < et = dans le texte, c'est a dire une balise avec un attribut, ce qui ne traitera donc quasiment aucun contenu par defaut, sauf quelques rares <span lang='en'> ou autre curiosite de ce type
+r22451 | cedric    |  (jeu. 29 oct. 2015) | Report de r22429 : oups oubli dans r22428 : cas de typo appele en php depuis l'espace prive
+r22452 | b_b       |  (jeu. 29 oct. 2015) | report de r22346Fix #3430 : les boucles avec langue utilisaient lang_select_public() qui changeait sauvagement la langue en debut de boucle, sans la restaurer en fin de boucle, provoquant des bugs de contexteOn modifie la compulation des boucles : lang_select_public() appelle toujours lang_select(...) avec eventuellement la langue inchangee, et la boucle finit par un lang_select() qui depile et restaure la langue pour l'iteration suivante.
+
+SPIP-plugins-dist spip-3.0.20 -> spip-3.0.21  31 octobre 2015
 -------------------------------------------------------------
 
+r91143 | kent1     |  (mar. 28 juil. 2015) | Récupérer le title et le hreflang du lien entourant un modèle cf #3516
+r91205 | cedric    |  (jeu. 30 juil. 2015) | bug lors d'une erreur a la creation d'un mot (confirmation sur un doublon par exexemple)
+r91206 | cedric    |  (jeu. 30 juil. 2015) | complement a r91205
+r91209 | cy_altern |  (jeu. 30 juil. 2015) | report de 91148 (acces de google bot aux js et css)
+r91271 | cedric    |  (mer. 05 août 2015) | On ne verifie et alerte sur le doublon de titre de mot cle uniquement si c'est un nouveau mot cle ou si on retitre un mot cle existant, sinon c'est penible
+r91274 | cedric    |  (mer. 05 août 2015) | ne pas syndiquer un site en refuse
+r91290 | real3t    |  (ven. 07 août 2015) | Mise à jour pour la reconnaissance des moteurs de recherche. Reportable en 2.1.
+r91384 | real3t    |  (dim. 16 août 2015) | Un paramètre de plus reconnu pour Google
+r91608 | kent1     |  (jeu. 03 sept. 2015) | Report de la fonctionnalité de z91607"Faire prendre en compte à la prévisu l'hypothétique dir="ltr" ou dir="rtl" sur le textarea"
+r91797 | marcimat  |  (sam. 12 sept. 2015) | Report de r91796 :  Le pipeline "afficher_contenu_objet" n'était pas appelé pour l'affichage des groupes de mots sur la page exec=mots.
+r92079 | chankalan |  (mar. 29 sept. 2015) | pour affichage des colonnes des visites, report de http://zone.spip.org/trac/spip-zone/changeset/91091/  et http://zone.spip.org/trac/spip-zone/changeset/91404/
+r92236 | cedric    |  (sam. 10 oct. 2015) | Report de r92235 : soyons un peu moins bisounours : les diff necessitent aussi un interdire_scripts comme tous les contenus affiches dans l'espace prive
+r92513 | b_b       |  (jeu. 29 oct. 2015) | Report de r92512 : éviter d'afficher le script d'autosave dans la prévisu d'un forum quand le site est en mode parano avec $filtrer_javascript = -1;Ref ​https://core.spip.net/issues/3413 merci Équipement
+r92523 | b_b       |  (jeu. 29 oct. 2015) | report de r92522 : éviter une erreur PHP Strict Standards: Only variables should be passed by reference (Eric Camus)Ref ​https://core.spip.net/issues/3373
+r92525 | b_b       |  (jeu. 29 oct. 2015) | version 0.80.27 : report de r92524fix installation d'un plugin qui nécessite un plugin du core sur un site neuf, ​https://core.spip.net/issues/3572À la fin de svp_ajouter_depot(), utiliser svp_actualiser_paquets_locaux(true) qui, comme son nom l'indique, actualise les paquets locaux puis supprime les paquets locaux avec l'option true.Merci marcimat :)
+r92568 | real3t    |  (sam. 31 oct. 2015) | Et report en 3.0
+r92576 | real3t    |  (sam. 31 oct. 2015) | Sur une suggestion de Franck, intégration de Haosou dont parle cet article.
+r92578 | Francky   |  (sam. 31 oct. 2015) | Il semble que sogou soit un moteur en chinehttp://www.journaldunet.com/solutions/expert/59882/haosoule-moteur-de-recherche-qui-pourrait-changer-le-monde-du-seo-chinois.shtml
+r92580 | Francky   |  (sam. 31 oct. 2015) | Rangement alphabétique
+
+SPIP-Core spip-3.0.19 -> spip-3.0.20  23 juin 2015
+-------------------------------------------------------------
+r22106 | ben       |  (sam. 09 mai 2015) | 3.0.20 dev
+r22111 | cedric    |  (sam. 09 mai 2015) | #3418 : loger les creations de table pour debusquer le bug
+r22112 | cedric    |  (sam. 09 mai 2015) | #3418 : purger les opcode cache y compris sur php-fpm (a valider) / Credits pour le patch https://www.drupal.org/node/779482
+r22121 | cedric    |  (dim. 10 mai 2015) | Report de r22115 : realpath pour faire un clear opcode cache
+r22122 | cedric    |  (dim. 10 mai 2015) | Report de r22116 : #3418 : Octave utilise une configuration foireuse de opcode cache, qui persiste 2s apres modification du fichier sans possibilite de l'invalider manuellement. On essaye donc de detecter cette configuration et de faire un sleep() le temps que le cache soit invalide
+r22123 | cedric    |  (dim. 10 mai 2015) | Report de r22118 : Affectation de variable inutile (inutilisée) dans r22116.
+r22124 | cedric    |  (dim. 10 mai 2015) | Report de r22119 : Complement a r22116 : deplacer les  de code dans une fonction qui peut resservir dans un plugin si necessaire
+r22125 | cedric    |  (dim. 10 mai 2015) | Report de r22120 : Commenter les logs inutiles de r22111, on conserve la verification et seconde tentative de creation de table en cas d'echec
+r22155 | erational |  (lun. 18 mai 2015) | un warning de moins.
+r22204 | b_b       |  (ven. 05 juin 2015)| Report de r22203 / Fix #3440 : éviter la disparition du texte du troisième onglet de l'installation sous firefox win$ (merci à Franck pour le signalement)
+r22208 | b_b       |  (mar. 09 juin 2015)| report de r22201 / Fixe #3418 : complément à r22119 ajouter une seconde à la durée de opcache.revalidate_freq, sans quoi on retombe dans le cache
+r22246 | cedric    |  (ven. 19 juin 2015)| Report de r22245 : une option mtime sur purger_repertoire pour supprimer uniquement les fichiers plus anciens que filemtime donne
+r22247 | rasta     |  (ven. 19 juin 2015)| Charger la l'API autoriser avant de l'utiliser… On rappelle que SPIP n'utilise pas d'autoload, et que donc on DOIT TOUJOURS penser à charger les API avant de les utiliser. :)
+r22252 | toutati   |  (dim. 21 juin 2015)| un petit {tout} qui permet d'afficher la liste des traductions, même si l'article a une rubrique en -1 (cas du plugin pages uniques)
+
+SPIP-plugins-dist spip-3.0.19 -> spip-3.0.20  23 juin 2015
+-------------------------------------------------------------
+r89160 | eric      |  (ven. 08 mai 2015) | Le décideur prend la première version compatible des plugins dépendants si plusieurs sont disponibles. Autant prendre la version la plus élevée.
+r89163 | eric      |  (ven. 08 mai 2015) | oubli d'incrément.
+r89165 | cedric    |  (ven. 08 mai 2015) | Fix https://core.spip.net/issues/3398 : date_thread ne doit etre mis a jour que si le message est publie
+r89169 | franck    |  (ven. 08 mai 2015) | Ce n'est plus http://core.spip.org mais https://core.spip.net
+r89230 | cedric    |  (sam. 09 mai 2015) | Report de r89229 : Fix https://core.spip.net/issues/2899 : erreur 404 mal geree en urls propres
+r89281 | marcimat  |  (dim. 10 mai 2015) | Corriger #3416 : ne pas afficher obsolète un plugin local en présence d'une version plus élevée du même plugin, mais non compatible avec ce SPIP.Notons que le terme 'obsolète' ne convient pas vraiment. En effet, dans le cas suivants, tous 2 compatibles avec notre SPIP :A : prefixe TOTO | v1.0.0 | stableB : prefixe TOTO | v1.1.0 | stableC : prefixe TOTO | v1.1.1 | testAlors - A est considéré obsolète (OK)- B n'est pas considéré obsolète (OK)- C est considéré obsolète (hum…)En fait un terme 'prioritaire' sur B à true, et false sur les autres aurait été plus adapté. Parce que C n'est pas tellement obsolète,juste plus à jour, mais d'un état inférieur.
+r89311 | marcimat  |  (mar. 12 mai 2015) | Report de r85634 : Eviter des "Warning: Illegal string offset..." (Oxymore)(JandB)
+r89345 | marcimat  |  (jeu. 14 mai 2015) | Report de r89344 : Fermer véritablement #3398 car la correction r89165 n'avait pas vu un piège et créait un beau warning :$t, censé être un tableau, était réaffecté au dessus pour recevoir l'identifiant du thread.On nomme pour ce cas correctement la variable.
+r89347 | marcimat  |  (jeu. 14 mai 2015) | Report de r89346 :  Ferme #3443 et suite de #3380 , qui complète r89155 (et 89157) : il faut que l'autorisation d'associer des documents, tout commele fait déjà la nouvelle autorisation de dissocier des documents, prenne en compte les identifiants négatifs.Ils correspondent à l'ajout d'un document sur un nouvel article encore en édition et non encore enregistré (pas d'id_article connu),ce qui affecte le document avec 0-$id_auteur qui l'a envoyé.
+r89691 | marcimat  |  (mer. 27 mai 2015) | Correction d'un cas très particulier lors de l'installation de SPIP et du plugin organiseur, si un pluginappelle la fonction 'creer_base()' avant l'installation du plugin organiseur. (Cas qui peut arriversi quelqu'un ajoute au moins un plugin dans plugins-dist qui fait cela, avant d'avoir installé SPIP)Dans ce cas, la table 'spip_messages' est déjà créée, et Organiseur croit que l'on vient d'une mise à jourd'un vieux SPIP. Et à ce moment là, il ne crée pas les colonnes nécessaires (imessage et messagerie) dans SPIP auteurs,mais par contre il fait toutes les procédures de mises à jour.Du coup, on ajoute une procédure de mise à jour qui peut créer ces champs s'ils manquent.Corrige une erreur «Critère inconnu =» sur le squelettes prive/objets/liste/auteurs-enligne à l'installation.À noter que ce squelette dans SPIP fait appel à la colonne imessage depuis https://core.spip.net/projects/spip/repository/revisions/21401 , alors que ce champ estdéclaré dans ce plugin. Peut être faudrait il surcharger le squelette dans ce plugin pour permettre à SPIP de pouvoir fonctionner sans.
+r89923 | real3t    |  (ven. 05 juin 2015)| Ce bouton actualiser la liste des plugins était tellement bas que j'étais passé à côté (merci Marcimat pour le signalement)
+r89933 | real3t    |  (ven. 05 juin 2015)| Revert à la demande d'Eric : une boite d'info, c'est dans la navigation (bon, moi, je pense que c'est une boite de raccourcis, mais...)
+r90060 | b_b       |  (mar. 09 juin 2015)| Report de r90059Fix ​https://core.spip.net/issues/3452 : rétablir la possibilité de joindre un document sur un forumSuite à r89155, il faut définir les autorisation autoriser_forum_associerdocuments_dist et autoriser_forum_dissocierdocuments_dist pour permettre de lier/délier un document à un message de forum. Les deux fonctions renvoient toujours true pour que cela fonctionne, voir remarques ici ​https://core.spip.net/issues/3452#note-4
+r90353 | cedric    |  (ven. 19 juin 2015)| Report de r90352 : Detection des flooders : quand un utilisateur comptabilise plus de 200 visites d'articles dans une visite,on note son IP dans le dossier tmp/flood/Au bout de 24H (redefinissable via la constante _IP_FLOOD_TTL) on la supprime de tmp/flood/Ces IP reperees peuvent ensuite etre considerees comme des BOT ou meme kickee temporairement, au choix, action a ajouter dans le mes_options.php par exemple
+r90358 | real3t    |  (ven. 19 juin 2015)| Report de [90354] et [90356] : Retour sur [89155] : il est autorise d'associer des documents a d'autres documents, certains plugins le font deja, evitons la casse pas trop justifiee (b_b, kent1, RealET)
+
+
+SPIP-Core spip-3.0.17 -> spip-3.0.19  08 mai 2015
+-------------------------------------------------------------
 r21519 | ben       |  (mer. 13 août 2014) | Allez reparton(ton) en dev pour un tour
 r21529 | ben       |  (jeu. 21 août 2014) | Pas d'onglet dans le nom de la fonction d'autorisation. Permet à un redacteur de pouvoir remodifier la langue et la couleur dans l'espace privé
 r21531 | eric      |  (ven. 22 août 2014) | Eviter des "illegal offset" si l'utilisateur n'est pas connecté (déjà corrigé en 3.1).
index 89a35fa..2c91ea0 100644 (file)
@@ -22,7 +22,7 @@ function action_desinstaller_plugin_dist() {
        if (defined('_DIR_PLUGINS_SUPPL') AND $dir_plugins==_DIR_PLUGINS_SUPPL)
                $dir_type = "_DIR_PLUGINS_SUPPL";
        $installer_plugins = charger_fonction('installer', 'plugins');
-       $infos = $installer_plugins($plugin, 'uninstall');
+       $infos = $installer_plugins($plugin, 'uninstall',$dir_type);
        if ($infos AND !$infos['install_test'][0]) {
                include_spip('inc/plugin');
                ecrire_plugin_actifs(array($plugin),false,'enleve');
index 41eeff1..759b422 100644 (file)
@@ -11,7 +11,7 @@
 \***************************************************************************/
 
 if (!defined('_ECRIRE_INC_VERSION')) return;
-include_spip('base/objets');
+require_once _ROOT_RESTREINT . 'base/objets.php';
 
 //
 // Utilitaires indispensables autour des serveurs SQL
index 02450d5..2b97459 100644 (file)
@@ -55,13 +55,33 @@ function base_determine_autoinc($table,$desc=array()){
  * @return void
  */
 function creer_ou_upgrader_table($table,$desc,$autoinc,$upgrade=false,$serveur='') {
+       #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
        $sql_desc = $upgrade ? sql_showtable($table,true,$serveur) : false;
+       #if (!$sql_desc) $sql_desc = false;
+       #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
        if (!$sql_desc) {
                if ($autoinc==='auto')
                        $autoinc = base_determine_autoinc($table,$desc);
+               #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
                sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
+               // verifier la bonne installation de la table (php-fpm es-tu la ?)
+               $sql_desc = sql_showtable($table,true,$serveur);
+               #if (!$sql_desc) $sql_desc = false;
+               #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
+               if (!$sql_desc){
+                       // on retente avec un sleep ?
+                       sleep(1);
+                       sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
+                       $sql_desc = sql_showtable($table,true,$serveur);
+                       #if (!$sql_desc) $sql_desc = false;
+                       #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
+                       if (!$sql_desc){
+                               spip_log("Echec creation table $table","maj"._LOG_CRITIQUE);
+                       }
+               }
        }
        else {
+               #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
                // ajouter les champs manquants
                // on ne supprime jamais les champs, car c'est dangereux
                // c'est toujours a faire manuellement
index af7837e..934091a 100644 (file)
@@ -75,7 +75,9 @@ function cvtautosave_formulaire_traiter($flux){
        if ($cle_autosave = _request('autosave')){
                include_spip('inc/session');
                session_set('session_autosave_'.$cle_autosave, null);
+       }
 
+       if (isset($GLOBALS['visiteur_session']) AND $GLOBALS['visiteur_session']){
                // delai par defaut avant purge d'un backup de form : 72H
                if (!defined('_AUTOSAVE_GB_DELAY')) define('_AUTOSAVE_GB_DELAY',72*3600);
                $time_too_old = time() - _AUTOSAVE_GB_DELAY;
@@ -92,6 +94,7 @@ function cvtautosave_formulaire_traiter($flux){
                        }
                }
        }
+       
        return $flux;
 }
 
index af084e4..1702c31 100644 (file)
@@ -69,7 +69,8 @@ function formulaires_editer_objet_verifier($type,$id='new', $oblis = array()){
                }
        }
        foreach($oblis as $obli) {
-               if (!_request($obli)) {
+               $value = _request($obli);
+               if (is_null($value) OR !(is_array($value)?count($value):strlen($value))) {
                        if (!isset($erreurs[$obli])) { $erreurs[$obli] = ''; }
                        $erreurs[$obli] .= _T("info_obligatoire");
                }
index 03620a1..83c5429 100644 (file)
@@ -145,6 +145,11 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr
        }       else {
                // enlever le timestamp eventuel
                $source=preg_replace(',[?][0-9]+$,','',$source);
+               if (strpos($source,"?")!==false
+                       AND strncmp($source,_DIR_IMG,strlen(_DIR_IMG))==0
+                       AND file_exists($f=preg_replace(',[?].*$,','',$source))){
+                       $source = $f;
+               }
                $fichier = $source;
        }
 
index cc10091..4621ebc 100644 (file)
@@ -100,22 +100,22 @@ function protocole_implicite($url_absolue){
 // ne s'applique qu'aux textes contenant des liens
 // http://doc.spip.org/@liens_absolus
 function liens_absolus($texte, $base='') {
-       if (preg_match_all(',(<(a|link|image)[[:space:]]+[^<>]*href=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS', 
+       if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', 
        $texte, $liens, PREG_SET_ORDER)) {
                foreach ($liens as $lien) {
-                       $abs = url_absolue($lien[3], $base);
-                       if ($abs <> $lien[3] and !preg_match('/^#/',$lien[3]))
-                               $texte = str_replace($lien[0], $lien[1].$abs.$lien[4], $texte);
-               }
-       }
-       if (preg_match_all(',(<(img|script)[[:space:]]+[^<>]*src=["\']?)([^"\' ><[:space:]]+)([^<>]*>),imsS', 
-       $texte, $liens, PREG_SET_ORDER)) {
-               foreach ($liens as $lien) {
-                       $abs = url_absolue($lien[3], $base);
-                       if ($abs <> $lien[3])
-                               $texte = str_replace($lien[0], $lien[1].$abs.$lien[4], $texte);
+                       foreach(array('href', 'src') as $attr) {
+                               $href = extraire_attribut($lien[0], $attr);
+                               if (strlen($href)>0) {
+                                       $abs = url_absolue($href, $base);
+                                       if ($href != $abs and !preg_match('/^#/',$href)) {
+                                               $texte_lien = inserer_attribut($lien[0], $attr, $abs);
+                                               $texte = str_replace($lien[0],$texte_lien,$texte);
+                                       }
+                               }
+                       }
                }
        }
+
        return $texte;
 }
 
index bde1a53..75b0fcb 100644 (file)
@@ -181,8 +181,7 @@ function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate=t
                // liberer le verrou et fermer le fichier
                @chmod($fichier, _SPIP_CHMOD & 0666);
                if ($ok) {
-                       if (!defined('_OPCACHE_BUG') AND function_exists('opcache_invalidate'))
-                               opcache_invalidate($fichier, true);
+                       spip_clear_opcode_cache(realpath($fichier));
                        return $ok;
                }
        }
@@ -294,11 +293,64 @@ function spip_unlink($f) {
  * @param null $filename
  */
 function spip_clearstatcache($clear_realpath_cache = false, $filename=null){
-       return (version_compare(PHP_VERSION, '5.3.0') >= 0)?
-               clearstatcache($clear_realpath_cache,$filename):clearstatcache();
+       if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) {
+   // Below PHP 5.3, clearstatcache does not accept any function parameters.
+   return clearstatcache();
+ }
+ else {
+        return clearstatcache($clear_realpath_cache, $filename);
+ }
+
+}
+
+
+/**
+ * Invalidates a PHP file from any active opcode caches.
+ *
+ * If the opcode cache does not support the invalidation of individual files,
+ * the entire cache will be flushed.
+ * kudo : http://cgit.drupalcode.org/drupal/commit/?id=be97f50
+ *
+ * @param string $filepath
+ *   The absolute path of the PHP file to invalidate.
+ */
+function spip_clear_opcode_cache($filepath) {
+       spip_clearstatcache(TRUE, $filepath);
+
+  // Zend OPcache
+  if (function_exists('opcache_invalidate')) {
+    opcache_invalidate($filepath, TRUE);
+  }
+  // APC.
+  if (function_exists('apc_delete_file')) {
+    // apc_delete_file() throws a PHP warning in case the specified file was
+    // not compiled yet.
+    // @see http://php.net/apc-delete-file
+    @apc_delete_file($filepath);
+  }
 }
 
-/*
+/**
+ * si opcache est actif et en mode validate_timestamps
+ * le timestamp ne sera checke qu'apres revalidate_freq s
+ * il faut donc attendre ce temps la pour etre sur qu'on va bien beneficier de la recompilation
+ * NB c'est une config foireuse deconseillee de opcode cache mais malheureusement utilisee par Octave
+ * cf http://stackoverflow.com/questions/25649416/when-exactly-does-php-5-5-opcache-check-file-timestamp-based-on-revalidate-freq
+ * et http://wiki.mikejung.biz/PHP_OPcache
+ *
+ * Ne fait rien en dehors de ce cas
+ *
+ */
+function spip_attend_invalidation_opcode_cache(){
+       if (function_exists('opcache_get_configuration')
+         AND @ini_get('opcache.enable')
+         AND @ini_get('opcache.validate_timestamps')
+         AND $duree = @ini_get('opcache.revalidate_freq') ) {
+               sleep($duree+1);
+       }
+}
+
+/**
  * Suppression complete d'un repertoire.
  *
  * http://www.php.net/manual/en/function.rmdir.php#92050
index 593e8ac..f52471d 100644 (file)
@@ -88,12 +88,26 @@ function suivre_invalideur($cond, $modif=true) {
 
 
 
-// Utilisee pour vider le cache depuis l'espace prive
-// (ou juste les squelettes si un changement de config le necessite)
-// si $atime est passee en argument, ne pas supprimer ce qui a servi
-// plus recemment que cette date (via fileatime)
-// retourne le nombre de fichiers supprimes
-// http://doc.spip.org/@purger_repertoire
+/**
+ * Purge un répertoire de ses fichiers
+ *
+ * Utilisée entre autres pour vider le cache depuis l'espace privé
+ *
+ * @uses supprimer_fichier()
+ * 
+ * @param string $dir
+ *     Chemin du répertoire à purger
+ * @param array $options
+ *     Tableau des options. Peut être :
+ *
+ *     - atime : timestamp pour ne supprimer que les fichiers antérieurs
+ *       à cette date (via fileatime)
+ *     - mtime : timestamp pour ne supprimer que les fichiers antérieurs
+ *       à cette date (via filemtime)
+ *     - limit : nombre maximum de suppressions
+ * @return int
+ *     Nombre de fichiers supprimés
+**/
 function purger_repertoire($dir, $options=array()) {
        $handle = @opendir($dir);
        if (!$handle) return;
@@ -105,8 +119,9 @@ function purger_repertoire($dir, $options=array()) {
                if ($fichier[0] == '.') continue;
                $chemin = "$dir/$fichier";
                if (is_file($chemin)) {
-                       if (!isset($options['atime'])
-                       OR (@fileatime($chemin) < $options['atime'])) {
+                       if (  (!isset($options['atime']) OR (@fileatime($chemin) < $options['atime']))
+                               AND (!isset($options['mtime']) OR (@filemtime($chemin) < $options['mtime']))
+                         ) {
                                supprimer_fichier($chemin);
                                $total ++;
                        }
index 9fe1e64..8bcb588 100644 (file)
@@ -33,7 +33,7 @@ $GLOBALS['codes_langues'] = array(
        'ay' => "Aymara",
        'az' => "Az&#601;rbaycan dili",
        'ba' => "Bashkir",
-       'be' => "&#1041;&#1077;&#1083;&#1072;&#1088;&#1091;&#1089;&#1082;&#1110;",
+       'be' => "&#1041;&#1077;&#1083;&#1072;&#1088;&#1091;&#1089;&#1082;&#1072;&#1103;",
        'ber_tam' => "Tamazigh",
        'ber_tam_tfng' => "Tamazigh tifinagh",
        'bg' => "&#1073;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080;",
@@ -48,7 +48,7 @@ $GLOBALS['codes_langues'] = array(
        'co' => "corsu",
        'cpf' => "Kr&eacute;ol r&eacute;yon&eacute;",
        'cpf_dom' => "Krey&ograve;l",
-       'cpf_hat' => "Kr&eacute;y&ograve;l (P&eacute;yi Dayiti)",
+       'cpf_hat' => "Krey&ograve;l (Peyi Dayiti)",
        'cs' => "&#269;e&#353;tina",
        'cy' => "Cymraeg",      # welsh, gallois
        'da' => "dansk",
@@ -91,7 +91,7 @@ $GLOBALS['codes_langues'] = array(
        'hi' => "&#2361;&#2367;&#2306;&#2342;&#2368;",
        'hr' => "hrvatski",
        'hu' => "magyar",
-       'hy' => "Հայերեն",// Arménien
+       'hy' => "&#1344;&#1377;&#1397;&#1381;&#1408;&#1381;&#1398;",// Arménien
        'ia' => "Interlingua",
        'id' => "Indonesia",
        'ie' => "Interlingue",
index 9fc5d48..a76d5c7 100644 (file)
@@ -255,7 +255,9 @@ function traiter_modeles($texte, $doublons=false, $echap='', $connect='', $liens
                                $lien = array(
                                        'href' => extraire_attribut($r[0],'href'),
                                        'class' => extraire_attribut($r[0],'class'),
-                                       'mime' => extraire_attribut($r[0],'type')
+                                       'mime' => extraire_attribut($r[0],'type'),
+                                       'title' => extraire_attribut($r[0],'title'),
+                                       'hreflang' => extraire_attribut($r[0],'hreflang')
                                );
                                $n = strlen($r[0]);
                                $a -= $n;
@@ -275,7 +277,7 @@ function traiter_modeles($texte, $doublons=false, $echap='', $connect='', $liens
                                // dans les parametres, plutot que les liens echappes
                                if (!is_null($liens))
                                        $params = str_replace($liens[0], $liens[1], $params);
-                         $modele = inclure_modele($type, $id, $params, $lien, $connect, $env);
+                               $modele = inclure_modele($type, $id, $params, $lien, $connect, $env);
                                // en cas d'echec, 
                                // si l'objet demande a une url, 
                                // creer un petit encadre vers elle
index b4265cf..1510889 100644 (file)
@@ -518,9 +518,14 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
        // generer le fichier _CACHE_PIPELINE
        pipeline_precompile();
 
-       // lancer et initialiser les nouveaux crons !
-       include_spip('inc/genie');
-       genie_queue_watch_dist();
+       // attendre eventuellement l'invalidation du cache opcode
+       spip_attend_invalidation_opcode_cache();
+
+       if (spip_connect()) {
+               // lancer et initialiser les nouveaux crons !
+               include_spip('inc/genie');
+               genie_queue_watch_dist();
+       }
 
        return ($GLOBALS['meta']['plugin'] != $actifs_avant);
 }
@@ -786,4 +791,4 @@ function ecrire_fichier_php($nom, $contenu, $comment='')
        ecrire_fichier($nom, 
                       '<'.'?php' . "\n" . $comment ."\nif (defined('_ECRIRE_INC_VERSION')) {\n". $contenu . "}\n?".'>');
 }
-?>
+
index 9c27e6f..353c0a1 100644 (file)
@@ -267,7 +267,8 @@ function puce_statut_changement_rapide($id, $statut, $id_rubrique, $type='articl
        $desc = lister_tables_objets_sql($table);
        if (!isset($desc['statut_textes_instituer']))
                return $inser_puce;
-
+       
+       include_spip('inc/autoriser');
        // cas ou l'on a un parent connu (devrait disparaitre au profit du second cas plus generique)
        if ($id_rubrique){
                if (!autoriser('publierdans', 'rubrique', $id_rubrique))
index af706b3..c0cec0b 100644 (file)
@@ -156,6 +156,7 @@ function typo($letexte, $echapper=true, $connect=null, $env=array()) {
        if (is_null($connect)){
                $connect = '';
                $interdire_script = true;
+               $env['espace_prive'] = 1;
        }
 
        // Echapper les codes <html> etc
@@ -183,6 +184,12 @@ function typo($letexte, $echapper=true, $connect=null, $env=array()) {
        if ($interdire_script)
                $letexte = interdire_scripts($letexte);
 
+       // Dans l'espace prive on se mefie de tout contenu dangereux
+       // https://core.spip.net/issues/3371
+       if (isset($env['espace_prive']) AND $env['espace_prive']){
+               $letexte = echapper_html_suspect($letexte);
+       }
+
        return $letexte;
 }
 
index b0aab8a..bd141cc 100644 (file)
@@ -381,15 +381,52 @@ function echapper_faux_tags($letexte){
   $letexte = "";
   while (count($textMatches)) {
        // un texte a echapper
-       $letexte .= str_replace(array("<"),array('&lt;'),array_shift($textMatches));
+       $letexte .= str_replace("<",'&lt;',array_shift($textMatches));
        // un tag html qui a servit a faite le split
                $letexte .= array_shift($textMatches);
   }
   return $letexte;
 }
 
-// Securite : utiliser SafeHTML s'il est present dans ecrire/safehtml/
-// http://doc.spip.org/@safehtml
+/**
+ * Si le html contenu dans un texte ne passe pas sans transformation a travers safehtml
+ * on l'echappe
+ * si safehtml ne renvoie pas la meme chose on echappe les < en &lt; pour montrer le contenu brut
+ *
+ * @param string $texte
+ * @return string
+ */
+function echapper_html_suspect($texte){
+       if (strpos($texte,'<')===false OR strpos($texte,'=')===false)
+               return $texte;
+
+       // on teste sur strlen car safehtml supprime le contenu dangereux
+       // mais il peut aussi changer des ' en " sur les attributs html,
+       // donc un test d'egalite est trop strict
+       if (strlen(safehtml($texte))!==strlen($texte)){
+               $texte = str_replace("<","&lt;",$texte);
+       }
+
+       return $texte;
+}
+
+
+/**
+ * Sécurise un texte HTML 
+ *
+ * Échappe le code PHP et JS.
+ * Applique en plus safehtml si un plugin le définit dans inc/safehtml.php
+ *
+ * Permet de protéger les textes issus d'une origine douteuse (forums, syndications...)
+ *
+ * @filtre
+ * @link http://www.spip.net/4310
+ * 
+ * @param string $t
+ *      Texte à sécuriser
+ * @return string
+ *      Texte sécurisé
+**/
 function safehtml($t) {
        static $safehtml;
 
index a76b0fd..923431f 100644 (file)
@@ -969,8 +969,11 @@ function find_in_path ($file, $dirname='', $include=false) {
                                        include_once _ROOT_CWD . $a;
                                        $inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
                                }
-                               if (!defined('_SAUVER_CHEMIN'))
-                                       define('_SAUVER_CHEMIN',true);
+                               if (!defined('_SAUVER_CHEMIN')){
+                                       // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
+                                       if (is_null($GLOBALS['path_files'])) return $a;
+                                       define('_SAUVER_CHEMIN', true);
+                               }
                                return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
                        }
                }
@@ -988,8 +991,11 @@ function find_in_path ($file, $dirname='', $include=false) {
                }
        }
 
-       if (!defined('_SAUVER_CHEMIN'))
-               define('_SAUVER_CHEMIN',true);
+       if (!defined('_SAUVER_CHEMIN')){
+               // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
+               if (is_null($GLOBALS['path_files'])) return false;
+               define('_SAUVER_CHEMIN', true);
+       }
        return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
 }
 
@@ -1873,6 +1879,7 @@ function init_var_mode(){
                                                        if (!defined('_VAR_MODE')) define('_VAR_MODE',$_GET['var_mode']);
                                                        break;
                                        }
+          if (isset($GLOBALS['visiteur_session']['nom']))
                                        spip_log($GLOBALS['visiteur_session']['nom']
                                                . " "._VAR_MODE);
                                }
index f588dfd..31467ab 100644 (file)
@@ -294,7 +294,7 @@ $liste_des_authentifications = array(
 // 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.19";
+$spip_version_branche = "3.0.21";
 // 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;
index 64b57cc..a14f6d0 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="spip"
        categorie="outil"
-       version="3.0.19"
+       version="3.0.21"
        etat="stable"
        compatibilite="];["
        schema="19268"
index 34f4fba..b0f58a9 100644 (file)
@@ -477,6 +477,8 @@ function inclure_modele($type, $id, $params, $lien, $connect='', $env=array()) {
                $contexte['lien'] = str_replace("&quot;",'"', $lien['href']);
                $contexte['lien_class'] = $lien['class'];
                $contexte['lien_mime'] = $lien['mime'];
+               $contexte['lien_title'] = $lien['title'];
+               $contexte['lien_hreflang'] = $lien['hreflang'];
        }
 
        // Traiter les parametres
index 7341b0a..3741856 100644 (file)
@@ -446,6 +446,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
                // afin que le corps de boucle affecte la globale directement
                $init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
                $fin_lang = "lang_select();\n\t";
+               $fin_lang_select_public = "\n\t\tlang_select();";
 
                $corps .= 
                        "\n\t\tlang_select_public("
@@ -459,6 +460,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
        else {
                $init_lang = '';
                $fin_lang = '';
+               $fin_lang_select_public = '';
                // sortir les appels au traducteur (invariants de boucle)
                if (strpos($return, '?php') === false
                AND preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)) {
@@ -503,6 +505,9 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
                . $boucle->partie 
                . $corps;
 
+       // depiler la lang de la boucle si besoin
+       $corps .= $fin_lang_select_public;
+
        // si le corps est une constante, ne pas appeler le serveur N fois!
 
        if (preg_match(CODE_MONOTONE,str_replace("\\'",'',$corps), $r)) {
index 71aca21..02fee78 100644 (file)
@@ -421,21 +421,22 @@ function lang_select_public($lang, $lang_select, $titre=null) {
        // Cas 1. forcer_lang = true et pas de critere {lang_select}
        if (isset($GLOBALS['forcer_lang']) AND $GLOBALS['forcer_lang']
        AND $lang_select !== 'oui')
-               return;
+               $lang = $GLOBALS['spip_lang'];
 
        // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
-       if (!strlen($lang))
-               return;
+       elseif (!strlen($lang))
+               $lang = $GLOBALS['spip_lang'];
 
        // Cas 3. l'objet est multilingue !
-       if ($lang_select !== 'oui'
-       AND strlen($titre) > 10
-       AND strpos($titre, '<multi>') !== false
-       AND strpos(echappe_html($titre), '<multi>') !== false)
-               return;
-
-       // Tous les cas ayant ete elimines, faire le job
-       $GLOBALS['spip_lang'] = $lang;
+       elseif ($lang_select !== 'oui'
+         AND strlen($titre) > 10
+         AND strpos($titre, '<multi>') !== false
+         AND strpos(echappe_html($titre), '<multi>') !== false)
+               $lang = $GLOBALS['spip_lang'];
+
+       // faire un lang_select() eventuellement sur la langue inchangee
+       lang_select($lang);
+
        return;
 }
 
index 50064e8..ea4aca8 100644 (file)
@@ -485,23 +485,24 @@ function phraser_criteres($params, &$result) {
                          $not = "";
                        } else {
                          // Le debut du premier argument est l'operateur
-                         preg_match("/^([!]?)([a-zA-Z][a-zA-Z0-9]*)[[:space:]]*(.*)$/ms", $param, $m);
+                         preg_match("/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms", $param, $m);
                          $op = $m[2];
                          $not = $m[1];
+                         $cond = $m[3];
                          // virer le premier argument,
                          // et mettre son reliquat eventuel
                          // Recopier pour ne pas alterer le texte source
                          // utile au debusqueur
-                         if ($m[3]) {
+                         if ($m[4]) {
                            // une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
-                           if (preg_match(',^(["\'])(.*)\1$,', $m[3])) {
+                           if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
                                $c = null;
-                               eval ('$c = '.$m[3].';');
+                               eval ('$c = '.$m[4].';');
                                if (isset($c))
-                                       $m[3] = $c;
+                                       $m[4] = $c;
                            }
                            $texte = new Texte;
-                           $texte->texte = $m[3]; 
+                           $texte->texte = $m[4]; 
                            $v[1][0]= $texte;
                          } else array_shift($v[1]);
                        }
@@ -509,6 +510,7 @@ function phraser_criteres($params, &$result) {
                        $crit = new Critere;
                        $crit->op = $op;
                        $crit->not = $not;
+                       $crit->cond = $cond;
                        $crit->exclus ="";
                        $crit->param = $v;
                        $args[] = $crit;
index 649d3b2..983cb11 100644 (file)
@@ -45,7 +45,7 @@ if(!function_exists('revision_forum')){
                        ),
                        $c);
 
-               $t = $t["id_thread"];
+               $id_thread = $t["id_thread"];
                $cles = array();
                foreach (array('id_objet', 'objet') as $k) {
                        if (isset($c[$k]) AND $c[$k]) $cles[$k] = $c[$k];
@@ -54,15 +54,15 @@ if(!function_exists('revision_forum')){
                // Modification des id_article etc
                // (non autorise en standard mais utile pour des crayons)
                // on deplace tout le thread {sauf les originaux}.
-               if (count($cles) AND $t) {
-                       spip_log("update thread id_thread=$t avec ".var_export($cles,1),'forum.'. _LOG_INFO_IMPORTANTE);
-                       sql_updateq("spip_forum", $cles, "id_thread=".intval($t)." AND statut!='original'");
+               if (count($cles) AND $id_thread) {
+                       spip_log("update thread id_thread=$id_thread avec ".var_export($cles,1),'forum.'. _LOG_INFO_IMPORTANTE);
+                       sql_updateq("spip_forum", $cles, "id_thread=".$id_thread." AND statut!='original'");
                        // on n'affecte pas $r, car un deplacement ne change pas l'auteur
                }
 
-               // s'il y a vraiment eu une modif, on
-               // enregistre le nouveau date_thread
-               if ($err==='') {
+               // s'il y a vraiment eu une modif et que le message est public
+               // on enregistre le nouveau date_thread
+               if ($err==='' AND $t['statut'] == 'publie') {
                        // on ne stocke ni le numero IP courant ni le nouvel id_auteur
                        // dans le message modifie (trop penible a l'usage) ; mais du
                        // coup attention a la responsabilite editoriale
@@ -71,7 +71,7 @@ if(!function_exists('revision_forum')){
                        */
 
                        // & meme ca ca pourrait etre optionnel
-                       sql_updateq("spip_forum", array("date_thread" => date('Y-m-d H:i:s')), "id_thread=".$t);
+                       sql_updateq("spip_forum", array("date_thread" => date('Y-m-d H:i:s')), "id_thread=".$id_thread);
                }
        }
 }
index 6b461d7..792d512 100644 (file)
@@ -26,7 +26,7 @@
        <input type='hidden' name='nom_site' value="#ENV{nom_site}" />
        [<input type="hidden" name="id_forum" value="(#ENV*{id_forum})" />]
        [(#INCLURE{fond=formulaires/inc-forum_ajouter_mot, ajouter_mot})]
-       (#ENV*{erreurs}|table_valeur{previsu})
+       (#ENV**{erreurs}|table_valeur{previsu})
        </div>
 </form>]
 
index b86c5fe..5522d43 100644 (file)
@@ -82,6 +82,38 @@ function autoriser_forum_autoassocierdocument_dist($faire, $type, $id, $qui, $op
        return false;
 }
 
+/**
+ * Autorisation d'association de documents sur des forum
+ *
+ * Toujours
+ * 
+ * @param  string $faire Action demandée
+ * @param  string $type  Type d'objet sur lequel appliquer l'action
+ * @param  int    $id    Identifiant de l'objet
+ * @param  array  $qui   Description de l'auteur demandant l'autorisation
+ * @param  array  $opt   Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ */
+function autoriser_forum_associerdocuments_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
+
+/**
+ * Autorisation de dissociation de documents sur des forum
+ *
+ * Toujours
+ * 
+ * @param  string $faire Action demandée
+ * @param  string $type  Type d'objet sur lequel appliquer l'action
+ * @param  int    $id    Identifiant de l'objet
+ * @param  array  $qui   Description de l'auteur demandant l'autorisation
+ * @param  array  $opt   Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ */
+function autoriser_forum_dissocierdocuments_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
+
 /**
  * Autoriser a participer au forum des admins
  *
index 11454ef..0a43aa0 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="forum"
        categorie="communication"
-       version="1.8.37"
+       version="1.8.41"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/forum-32.png"
index 6ce2552..931dd02 100644 (file)
@@ -255,7 +255,10 @@ function autoriser_orphelins_supprimer_dist($faire, $type, $id, $qui, $opt){
  * @return bool
  */
 function autoriser_associerdocuments_dist($faire, $type, $id, $qui, $opt){
-       if ($type=='document') return false; // pas de document sur les documents
+       // cas particulier (hack nouvel objet)
+       if (intval($id)<0 AND $id==-$qui['id_auteur']){
+               return true;
+       }
        return autoriser('modifier',$type,$id,$qui,$opt);
 }
 
@@ -270,10 +273,9 @@ function autoriser_associerdocuments_dist($faire, $type, $id, $qui, $opt){
  * @return bool
  */
 function autoriser_dissocierdocuments_dist($faire, $type, $id, $qui, $opt){
-       if ($type=='document') return false; // pas de document sur les documents
-       // cas particulier
+       // cas particulier (hack nouvel objet)
        if (intval($id)<0 AND $id==-$qui['id_auteur']){
                return true;
        }
        return autoriser('modifier',$type,$id,$qui,$opt);
-}
\ No newline at end of file
+}
index 7762bac..5f1523f 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="medias"
        categorie="multimedia"
-       version="2.7.64"
+       version="2.7.66"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/portfolio-32.png"
index 43773d7..72bbd4b 100644 (file)
@@ -155,7 +155,7 @@ function mots_declarer_tables_objets_sql($tables){
        $tables[]['tables_jointures'][]= 'mots';
 
        // cas particulier des auteurs et mots : declarer explicitement mots_liens comme jointure privilegiee
-       // cf http://core.spip.org/issues/2329
+       // cf https://core.spip.net/issues/2329
        $tables['spip_auteurs']['tables_jointures'][]= 'mots_liens';
        $tables['spip_auteurs']['tables_jointures'][]= 'mots';
        $tables['spip_mots']['tables_jointures'][]= 'mots_liens';
index cfe52c2..750cd00 100644 (file)
@@ -68,13 +68,17 @@ function formulaires_editer_mot_verifier_dist($id_mot='new', $id_groupe=0, $reto
        // verifier qu'un mot du meme groupe n'existe pas avec le meme titre
        // la comparaison accepte un numero absent ou different
        // sinon avertir
-       if (!count($erreurs) AND !_request('confirm_titre_mot')){
-               if (sql_countsel("spip_mots", 
-                                               "titre REGEXP ".sql_quote("^([0-9]+[.] )?".preg_quote(supprimer_numero(_request('titre')))."$")
-                                               ." AND id_mot<>".intval($id_mot)))
-                       $erreurs['titre'] =
-                                               _T('mots:avis_doublon_mot_cle')
-                                               ." <input type='hidden' name='confirm_titre_mot' value='1' />";
+       // on ne fait la verification que si c'est une creation de mot ou un retitrage
+       if (!intval($id_mot)
+         OR supprimer_numero(_request('titre'))!==supprimer_numero(sql_getfetsel('titre','spip_mots','id_mot='.intval($id_mot)))){
+               if (!count($erreurs) AND !_request('confirm_titre_mot')){
+                       if (sql_countsel("spip_mots",
+                                                       "titre REGEXP ".sql_quote("^([0-9]+[.] )?".preg_quote(supprimer_numero(_request('titre')))."$")
+                                                       ." AND id_mot<>".intval($id_mot)))
+                               $erreurs['titre'] =
+                                                       _T('mots:avis_doublon_mot_cle')
+                                                       ." <input type='hidden' name='confirm_titre_mot' value='1' />";
+               }
        }
        return $erreurs;
 }
index cc9cfef..3e651cc 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="mots"
        categorie="edition"
-       version="2.4.13"
+       version="2.4.16"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/mot-32.png"
index 4a42642..c711e9c 100644 (file)
@@ -1,15 +1,15 @@
-[(#ID_MOT|oui)
+[(#ID_MOT|intval|oui)
        [(#AUTORISER{modifier,mot,#ID_MOT}|sinon_interdire_acces)]]
-[(#ID_MOT|non)
+[(#ID_MOT|intval|non)
        [(#AUTORISER{creer,mot,#ID_MOT,'','',#ARRAY{associer_objet,#ENV{associer_objet}}}|sinon_interdire_acces)]]
 
 #SET{retour,#ENV{redirect}|sinon{#ENV{id_mot}|?{#URL_ECRIRE{mot,id_mot=#ID_MOT},#URL_ECRIRE{mots}}}}
 <div class='cadre-formulaire-editer'>
 <div class="entete-formulaire">
-       [(#ID_MOT|oui)
+       [(#ID_MOT|intval|oui)
        [(#GET{retour}|icone_verticale{<:icone_retour:>,mot,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
        ]
-       [[(#ID_MOT|?{<:mots:info_modifier_mot:>,<:titre_ajouter_un_mot:>})]
+       [[(#ID_MOT|intval|?{<:mots:info_modifier_mot:>,<:titre_ajouter_un_mot:>})]
        <h1>(#ENV{titre,#INFO_TITRE{mot,#ID_MOT}|sinon{<:mots:texte_nouveau_mot:>}})</h1>]
 </div>
 
index ab9f852..4b09e5d 100644 (file)
@@ -9,7 +9,9 @@
                                [(#URL_ECRIRE{groupe_mots_edit,id_groupe=#ID_GROUPE}|icone_verticale{<:mots:icone_modif_groupe_mots:>,groupe_mots-24.png,edit,right})]
                        ]
                        <div id="wysiwyg">
-                       <INCLURE{fond=prive/objets/contenu/groupe_mots,id=#ID_GROUPE} />
+                       [(#PIPELINE{afficher_contenu_objet,#ARRAY{
+                               args,#ARRAY{type,groupe_mots,id,#ID_GROUPE,id_objet,#ID_GROUPE},
+                               data,#INCLURE{fond=prive/objets/contenu/groupe_mots, id=#ID_GROUPE, id_groupe=#ID_GROUPE}}})]
                        </div>
                        <div class="nettoyeur"></div>
                        <INCLURE{fond=prive/objets/liste/mots-admin,id_groupe,par=titre,ajax,env} />
@@ -23,4 +25,4 @@
                        ]
                #BOITE_FERMER
        </div>
-]</BOUCLE_groupes>
\ No newline at end of file
+]</BOUCLE_groupes>
index 8e3569e..d61305e 100644 (file)
@@ -34,20 +34,22 @@ function organiseur_upgrade($nom_meta_base_version,$version_cible){
        
        $maj = array();
        $maj['create'] = array(
-               array('maj_tables',array('spip_messages')),
-               array('sql_alter','TABLE spip_auteurs ADD imessage VARCHAR(3)'),
-               array('sql_alter','TABLE spip_auteurs ADD messagerie VARCHAR(3)'),
+               array('maj_tables', array('spip_messages', 'spip_auteurs')),
        );
 
        $maj['1.1.0'] = array(
                array('sql_updateq',"spip_messages",array('statut'=>'prepa'),"statut='redac'"),
-               array('sql_alter',"TABLE spip_messages ADD destinataires text DEFAULT '' NOT NULL"),
+               array('maj_tables', array('spip_messages')), // champ destinataires
        );
 
        $maj['1.1.1'] = array(
                array('sql_alter',"TABLE spip_messages CHANGE id_auteur id_auteur bigint(21) DEFAULT 0 NOT NULL"),
        );
 
+       $maj['1.1.2'] = array(
+               array('maj_tables', array('spip_auteurs')) // champs messagerie & imessage (parfois absents)
+       );
+
        include_spip('base/upgrade');
        maj_plugin($nom_meta_base_version, $version_cible, $maj);
 }
@@ -70,4 +72,4 @@ function organiseur_vider_tables($nom_meta_base_version) {
 
 
 
-?>
\ No newline at end of file
+?>
index 2698358..b437e8a 100644 (file)
@@ -1,11 +1,11 @@
 <paquet
        prefix="organiseur"
        categorie="date"
-       version="0.8.11"
+       version="0.8.12"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/calendrier-32.png"
-       schema="1.1.1"
+       schema="1.1.2"
 >      
 
        <nom>Organiseur</nom>
index e58aa22..014a6cb 100644 (file)
@@ -25,10 +25,8 @@ function formulaires_signature_charger_dist($id_article) {
        $valeurs = array(
                'id_petition' => $id_petition,
                'id_article' => $id_article, # pour compat
-               'session_nom' => sinon($GLOBALS['visiteur_session']['session_nom'],
-                       $GLOBALS['visiteur_session']['nom']),
-               'session_email'=> sinon($GLOBALS['visiteur_session']['session_email'],
-                       $GLOBALS['visiteur_session']['email']),
+               'session_nom' => isset($GLOBALS['visiteur_session']['session_nom'])?$GLOBALS['visiteur_session']['session_nom']:(isset($GLOBALS['visiteur_session']['nom'])?$GLOBALS['visiteur_session']['nom']:''),
+               'session_email'=> isset($GLOBALS['visiteur_session']['session_email'])?$GLOBALS['visiteur_session']['session_email']:(isset($GLOBALS['visiteur_session']['email'])?$GLOBALS['visiteur_session']['email']:''),
                'signature_nom_site'=>'',
                'signature_url_site'=>'http://',
                '_texte'=>$r['texte'],
index 7af4d05..8354489 100644 (file)
@@ -22,7 +22,7 @@
 .markItUp  {
        margin:5px 0 5px 0;
        clear:both;
-    position: relative;
+       position: relative;
 }
 .markItUp .markItUpContainer  {
        margin:0; padding:0;
@@ -86,7 +86,8 @@
        padding:1em;
        /* decaler de la hauteur de .markItUpTabs */
        position:relative;
-       top:2.2em; 
+       top:2.2em;
+       text-align:initial;
 }
 
 /* correction des styles spip_formulaires appliques par defaut (grr) */
index e8ef8c1..5e57baa 100644 (file)
                                        mark = $(this).parent().parent();\r
                                        objet = mark.parents('.formulaire_spip')[0].className.match(/formulaire_editer_(\w+)/);\r
                                        champ = mark.parents('li')[0].className.match(/editer_(\w+)/);\r
+                                       dir = mark.find('textarea').attr('dir');\r
                                        $(mark).find('.markItUpPreview').height(\r
                                                  $(mark).find('.markItUpHeader').height()\r
                                                + $(mark).find('.markItUpEditor').height()\r
                                                + $(mark).find('.markItUpFooter').height()\r
                                        );\r
 \r
-                                       $(mark).find('.markItUpHeader').hide();\r
-                                       $(mark).find('.markItUpEditor').hide();\r
-                                       $(mark).find('.markItUpFooter').hide();\r
+                                       $(mark).find('.markItUpHeader,.markItUpEditor,.markItUpFooter').hide();\r
                                        $(this).addClass('on').next().removeClass('on');\r
                                        $(mark).find('.markItUpPreview').show()\r
                                                .addClass('ajaxLoad')\r
@@ -50,7 +49,9 @@
                                                        (objet ? objet[1] : ''))\r
                                                )\r
                                                .removeClass('ajaxLoad');\r
-                                       \r
+                                       if(dir)\r
+                                               $(mark).find('.markItUpPreview').attr('dir',dir);\r
+\r
                                        //ouvre un nouvel onglet lorsqu'on clique sur un lien dans la prévisualisation\r
                                        $(".markItUpPreview a").attr("target","blank");\r
 \r
                                $('.previsuEditer').click(function(){\r
                                        mark = $(this).parent().parent();\r
                                        $(mark).find('.markItUpPreview').hide();\r
-                                       $(mark).find('.markItUpHeader').show();\r
-                                       $(mark).find('.markItUpEditor').show();\r
-                                       $(mark).find('.markItUpFooter').show();\r
+                                       $(mark).find('.markItUpHeader,.markItUpEditor,.markItUpFooter').show();\r
                                        $(this).addClass('on').prev().removeClass('on');\r
                                        return false;\r
                                });\r
                        }\r
 \r
-\r
                        function renderPreview(val, champ, objet) {\r
                                var phtml;\r
                                if (options.previewParserPath !== '') {\r
index 77b84cc..67eb828 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="porte_plume"
        categorie="edition"
-       version="1.12.4"
+       version="1.12.5"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="images/porte-plume-32.png"
index c4205e0..1b9f24b 100644 (file)
@@ -605,6 +605,9 @@ function propre_diff($texte) {
        $reg = end($regs);
        if (!$reg[1] AND $reg[2]) $texte.="</$reg[2]>";
 
+       // et interdire_scripts !
+       $texte = interdire_scripts($texte);
+
        return $texte;
 }
 
index 4e3542c..999f5c6 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="revisions"
        categorie="edition"
-       version="1.7.9"
+       version="1.7.10"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/revision-32.png"
index 935e6bf..a59a716 100644 (file)
@@ -40,9 +40,9 @@
                ]
        ]
        [<div class='id_rubrique'>(#GET{textes}|table_valeur{id_rubrique})</div>]
-       [<h4 class='surtitre'>(#GET{textes}|table_valeur{surtitre})</h4>]
-       <h1>[(#INFO_STATUT{#OBJET,#ID_OBJET}|puce_statut{#OBJET}) ][(#GET{textes}|table_valeur{titre}|sinon{<:info_sans_titre:>})]</h1>
-       [<h2 class='soustitre'>(#GET{textes}|table_valeur{soustitre})</h2>]
+       [<h4 class='surtitre'>(#GET{textes}|table_valeur{surtitre}|interdire_scripts)</h4>]
+       <h1>[(#INFO_STATUT{#OBJET,#ID_OBJET}|puce_statut{#OBJET}) ][(#GET{textes}|table_valeur{titre}|sinon{<:info_sans_titre:>}|interdire_scripts)]</h1>
+       [<h2 class='soustitre'>(#GET{textes}|table_valeur{soustitre}|interdire_scripts)</h2>]
 
        <div class="nettoyeur"></div>
        <div id="wysiwyg" class="revision">
index 1a3938b..c75575c 100644 (file)
@@ -50,7 +50,7 @@ function inc_safehtml_dist($t) {
                $t = entites_html($t); // tres laid, en cas d'erreur
 
        // supprimer un <li></li> provenant d'un <li> ouvrant seul+safehtml
-       // cf http://core.spip.org/issues/2201
+       // cf https://core.spip.net/issues/2201
        $t = str_replace("<li></li>","",$t);
 
        return $t;
index 17f7789..eb47437 100644 (file)
@@ -37,6 +37,7 @@ function executer_une_syndication() {
        // On va tenter un site 'sus' ou 'off' de plus de 24h, et le passer en 'off'
        // s'il echoue
        $where = sql_in("syndication", array('sus','off')) . "
+       AND statut<>'refuse'
        AND NOT(" . sql_date_proche('date_syndic', (0 - _PERIODE_SYNDICATION_SUSPENDUE) , "MINUTE") . ')';
        $id_syndic = sql_getfetsel("id_syndic", "spip_syndic", $where, '', "date_syndic", "1");
        if ($id_syndic) {
@@ -46,6 +47,7 @@ function executer_une_syndication() {
 
        // Et un site 'oui' de plus de 2 heures, qui passe en 'sus' s'il echoue
        $where = "syndication='oui'
+       AND statut<>'refuse'
        AND NOT(" . sql_date_proche('date_syndic', (0 - _PERIODE_SYNDICATION) , "MINUTE") . ')';
        $id_syndic = sql_getfetsel("id_syndic", "spip_syndic", $where, '', "date_syndic", "1");
 
index 8b0ac69..56d0e2d 100644 (file)
@@ -326,7 +326,7 @@ function my_strtotime($la_date, $lang=null) {
        // par la version anglaise avant de faire strtotime
        if ($lang){
                // "fr-fr"
-               $lang = reset(explode("-",$lang));
+               list($lang) = explode("-", $lang);
                static $months = null;
                if (!isset($months[$lang])){
                        $prev_lang = $GLOBALS['spip_lang'];
index c1a5ae0..7894bd7 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="sites"
        categorie="edition"
-       version="1.7.13"
+       version="1.7.14"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/site-32.png"
index 88b6226..cb58c60 100644 (file)
 rien=
 [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
 
-[Google]
-(^q|\&q|as_q)=
-(www\.|ww\.|maps\.)?(google|gogole)\.(.*)
-(web|www).toile.com
-www\.cegetel\.net
-search\.conduit\.com
-search\.sweetim\.com
-chello\.fr
-isearch\.avg\.com
+# -----------------------------------------------------------------------------
+# Services de mail
+# -----------------------------------------------------------------------------
 
-[Voila]
-(kw|rdata)=
-(search|moteur)(.*)\.voila\.(fr|com)
+[(email)]
+rien=
+imp(.*)\.free\.fr
+fc\.kayenta\.com
+courrielweb\.cmaisonneuve\.qc\.ca
+(.*)mail\.(.*)\.([a-z]+)$
+webmail([0-9]*)\.wanadoo\.fr
+www\.laposte\.net
+mail([0-9]*)\.voila\.fr
+\/(web)?mail\/
 
-[Yahoo!]
-p=
-(.*)(m|search|ink|dir|google)\.yahoo\.([a-z]+)$
 
-[AltaVista]
+# -----------------------------------------------------------------------------
+# Les moteurs vivants - Engines List
+# -----------------------------------------------------------------------------
+
+[Accentice]
 q=
-(.*)altavista\.com
+(.*\.|)accentice\.com
 
-[Delicious]
-p=
-delicious\.com
+[Alice]
+qs=
+\.aliceadsl\.
 
-[Ask]
+[alOt]
 q=
+search\.alot\.com
+
+[AOLsearch]
+(query|q)=
+(.*)search\.aol\.(.*)
+
+[AOL France]
+(query|q|r)=
+(.*)recherchet?\.aol\.fr
+
+[Ask]
+(q|queryTerm|searchfor)=
 (.*)\.ask\.com
 
-[HotBot]
-query=
-www\.hotbot\.com
+[Babylon]
+q=
+search\.babylon\.com
 
-[Freeserve]
+[Baidu]
+(wd|d)=
+(.*\.|)baidu\.com
+
+[Bing]
 q=
-search\.freeserve\.com
+(.*)\.bing\.com
+bing\.com
+search\.live\.com
 
-[Skeech]
+[BlueWin]
 query=
-skeech\.com
+search\.bluewin\.ch
 
-[Dogpile]
+[Copernic]
 query=
-(.*)dogpile\.com
+find\.copernic\.com
 
-[Metacrawler]
-query=
-metacrawler\.com
+[Crawler]
+q=
+(www\.)crawler\.com
 
-[Mirago]
-qry=
-www.mirago\.([a-z]+)$
+[Delicious]
+p=
+delicious\.com
 
-[Nomade]
-s=
-(.*)\.nomade\.fr
-(.*)\.nomade\.tiscali\.fr
-(.*)\.nomade\.aliceadsl\.fr
+[Delta Search]
+q=
+(.*\.|)delta-search\.com
 
-[Alice]
-qs=
-\.aliceadsl\.
+#
+# Dmoz
+#
+[dmoz.org]
+rien=
+(.*\.)?dmoz\.org
 
-[Lycos]
+[EO]
+q=
+www\.eo\.st
+
+[Dogpile]
 query=
-search\.lycos\.com
-vachercher\.lycos\.fr
+(.*)dogpile\.com
 
-[Francite]
-name=
-recherche\.francite\.com
+[Dogpile]
+q=
+(.*\.|)dogpile\.co\.uk
 
-[MSN]
-(q|s)=
-search(.*)\.msn\.([a-z.]+)$
-leguide(.*)\.msn\.([a-z]+)$
-search\.ninemsn\.com\.au
+[EasySearch]
+s=
+(.*\.|)easysearch\.org\.uk
 
-[Bing]
+[Ecosia]
 q=
-(.*)\.bing\.com
-bing\.com
-search\.live\.com
+(.*\.|)ecosia\.org
+
+[Exalead]
+q=
+www\.exalead\.fr
+www\.exalead\.com
 
 [Excite]
 search=
 www\.excite\.fr
 (.*)\.excite\.co\.jp
 
-[AOL France]
-(query|q|r)=
-(.*)recherchet?\.aol\.fr
+[Facemoods]
+s=
+start\.facemoods\.com
 
-[AOLsearch]
-(query|q)=
-(.*)search\.aol\.(.*)
+[FoxRef]
+key=
+www\.foxref\.org
 
-[AllTheWeb]
+[francesurf]
 q=
-www\.alltheweb\.com
-
-[ixquick]
-query=
-ixquick\.com
+www\.francesurf\.net
 
-[Netscape]
-search=
-search-intl\.netscape\.com
-search\.netscape\.com
-www\.netscape\.fr
+[Francite]
+name=
+recherche\.francite\.com
 
 [Free]
 q=
 search(.*)\.free\.fr
 
-[9online]
-query=
-www\.9online\.fr
+[Freeserve]
+q=
+search\.freeserve\.com
 
-[Naver]
+[Google]
+(^q|\&q|as_q|qs)=
+(www\.|ww\.|maps\.)?(google|gogole)\.(.*)
+(web|www).toile.com
+www\.cegetel\.net
+search\.conduit\.com
+search\.sweetim\.com
+chello\.fr
+isearch\.avg\.com
+
+[Govome]
+q=
+(.*\.|)govome\.com
+
+[Globososo]
+q=
+(.*\.|)globososo\.com
+
+[Haosou]
+q=
+www\.haosou\.com
+
+[HolaSearch]
+q=
+(.*\.|)holasearch\.com
+
+[HooSeek]
+recherche=
+(www\.)?hooseek\.com
+
+[HotBot]
 query=
-search\.naver\.com
+www\.hotbot\.com
 
-[Club Internet]
+[Iadah]
 q=
-recherche\.club-internet\.fr
+(www\.|)iadah\.com
 
-[Sympatico]
+[Incredibar]
+q=
+(search\.)incredibar\.com
+
+[ixquick]
 query=
-search\.sli\.sympatico\.ca
+ixquick\.com
 
-[Overture]
-Keywords=
-www\.overture\.com
+[LemmeFind]
+t=
+www\.lemmefind\.fr
 
-[moteur-recherche.net]
-keyword=
-www\.moteur-recherche\.net
+[Libero.it]
+query=
+arianna\.libero\.it
 
-[Reacteur.com]
-kw=
-www\.reacteur\.com
+[Lost]
+x_query=
+(www\.)?lo\.st
 
-[francesurf]
-q=
-www\.francesurf\.net
+[Lycos]
+query=
+search\.lycos\.com
+vachercher\.lycos\.fr
 
-[n9uf]
-((K|k)eywords|query)=
-(www\.)?neuf\.fr
+[Metacrawler]
+query=
+metacrawler\.com
+
+[Mirago]
+qry=
+www.mirago\.([a-z]+)$
+
+[MonGenie]
+Keywords=
+www\.mongenie\.com
 
 [MozBot]
 q=
 www\.mozbot\.([a-z]+)$
 
-[Cegetel]
+[moteur-recherche.net]
+keyword=
+www\.moteur-recherche\.net
+
+[MSN]
+(q|s)=
+search(.*)\.msn\.([a-z.]+)$
+leguide(.*)\.msn\.([a-z]+)$
+search\.ninemsn\.com\.au
+
+[mySearchDial]
 q=
-(www\.)?cegetel\.([a-z]+)$
+(.*\.|)mysearchdial\.com
 
 [MyWay]
 searchfor=
@@ -180,93 +252,55 @@ kf\.mysearch\.myway\.com
 www\.mywebsearch\.com
 (.*)\.mysearch\.com
 
-[MonGenie]
-Keywords=
-www\.mongenie\.com
+[MyWebSearch]
+searchfor=
+search\.mywebsearch\.com
+
+[Naver]
+query=
+search\.naver\.com
 
 [Need2Find]
 searchfor=
 kx\.search\.need2find\.com
 
-[Exalead]
-q=
-www\.exalead\.fr
-www\.exalead\.com
-
-[Virgilio.it]
-qs=
-search\.virgilio\.it
-
-[Libero.it]
-query=
-arianna\.libero\.it
-
-[LemmeFind]
-t=
-www\.lemmefind\.fr
+[Nomade]
+s=
+(.*)\.nomade\.fr
+(.*)\.nomade\.tiscali\.fr
+(.*)\.nomade\.aliceadsl\.fr
 
 [NovoNeo]
 q=
 www\.novoneo\.com
 
-[MyWebSearch]
-searchfor=
-search\.mywebsearch\.com
-
-[Copernic]
-query=
-find\.copernic\.com
-
-[Seek]
-qry_str=
-\.seek\.fr
-
 [Orange, le moteur]
 rdata=
 www\.lemoteur\.fr
 
-[alOt]
-q=
-search\.alot\.com
-
-#
-# Dmoz
-#
-[dmoz.org]
-rien=
-(.*\.)?dmoz\.org
-
-[FoxRef]
-key=
-www\.foxref\.org
-
-[OneBigWorld]
-Keywords=
-fr\.onebigworld\.com
+[Orange, le moteur]
+kw=
+lemoteur\.orange\.fr
 
-[BlueWin]
-query=
-search\.bluewin\.ch
+[ParallaxSearch]
+qs=
+(.*\.|)parallaxsearch\.com
 
-[EO]
+[Pesquisa]
 q=
-www\.eo\.st
-
-[HooSeek]
-recherche=
-(www\.)?hooseek\.com
+pesquisa\.sapo\.pt
 
-[Lost]
-x_query=
-(www\.)?lo\.st
+[Qone8]
+q=
+(.*\.|)qone8\.com
 
-[Babylon]
+[Qwant]
 q=
-search\.babylon\.com
+(.*\.|)qwant\.com
 
-[Crawler]
+[Search-Results]
 q=
-(www\.)crawler\.com
+(.*\.|)search-results\.com
 
 [Searchqu]
 q=
@@ -276,101 +310,101 @@ q=
 q=
 (www\.|)searchya\.com
 
-[Iadah]
+[Seek]
+qry_str=
+\.seek\.fr
+
+[Seznam]
 q=
-(www\.|)iadah\.com
+(.*\.|)seznam\.cz
 
-[Incredibar]
+[Skeech]
+query=
+skeech\.com
+
+[Sogou]
+query=
+www\.sogou\.com
+
+[Sympatico]
+query=
+search\.sli\.sympatico\.ca
+
+[Trouver]
 q=
-(search\.)incredibar\.com
+(.*\.|)trouver\.fr
 
-[Search-Results]
+[Vi-View]
 q=
-(.*\.|)search-results\.com
+(.*\.|)vi-view\.com
 
-[Facemoods]
-s=
-start\.facemoods\.com
+[Virgilio.it]
+qs=
+search\.virgilio\.it
+
+[Voila]
+(kw|rdata)=
+(search|moteur)(.*)\.voila\.(fr|com)
+
+[Yahoo!]
+p=
+(.*)(m|search|ink|dir|google)\.yahoo\.([a-z]+)$
 
 [Yandex]
 text=
 (www\.)?yandex\.ru
 
+[Wow]
+q=
+(.*\.|)wow\.com
+
 [Xeoo]
 k=
 (www\.)?xeoo\.com
 
-[Delta Search]
-q=
-(.*\.|)delta-search\.com
-
-[HolaSearch]
-q=
-(.*\.|)holasearch\.com
-
-[Govome]
-q=
-(.*\.|)govome\.com
-
-[mySearchDial]
-q=
-(.*\.|)mysearchdial\.com
-
-[SOSO Globo]
-q=
-(.*\.|)globososo\.com
 
-[Seznam]
-q=
-(.*\.|)seznam\.cz
-
-[Baidu]
-wd=
-(.*\.|)baidu\.com
+# -----------------------------------------------------------------------------
+# Les moteurs morts - Engines List
+# -----------------------------------------------------------------------------
 
-[Dogpile]
-q=
-(.*\.|)dogpile\.co\.uk
+[9online]
+query=
+www\.9online\.fr
 
-[Trouver]
+[AltaVista]
 q=
-(.*\.|)trouver\.fr
+(.*)altavista\.com
 
-[Pesquisa]
+[AllTheWeb]
 q=
-pesquisa\.sapo\.pt
+www\.alltheweb\.com
 
-[Qwant]
+[Cegetel]
 q=
-(.*\.|)qwant\.com
+(www\.)?cegetel\.([a-z]+)$
 
-[Qone8]
+[Club Internet]
 q=
-(.*\.|)qone8\.com
+recherche\.club-internet\.fr
 
-[Ecosia]
-q=
-(.*\.|)ecosia\.org
+[n9uf]
+((K|k)eywords|query)=
+(www\.)?neuf\.fr
 
-[Wow]
-q=
-(.*\.|)wow\.com
+[Netscape]
+search=
+search-intl\.netscape\.com
+search\.netscape\.com
+www\.netscape\.fr
 
-[Accentice]
-q=
-(.*\.|)accentice\.com
+[OneBigWorld]
+Keywords=
+fr\.onebigworld\.com
 
-#
-# Services de mail
-# 
+[Overture]
+Keywords=
+www\.overture\.com
 
-[(email)]
-rien=
-imp(.*)\.free\.fr
-fc\.kayenta\.com
-courrielweb\.cmaisonneuve\.qc\.ca
-(.*)mail\.(.*)\.([a-z]+)$
-webmail([0-9]*)\.wanadoo\.fr
-www\.laposte\.net
-mail([0-9]*)\.voila\.fr
-\/(web)?mail\/
+[Reacteur.com]
+kw=
+www\.reacteur\.com
index 63f3199..80b070b 100644 (file)
@@ -71,7 +71,7 @@ function genie_popularites_dist($t) {
                        #spip_query("ALTER TABLE spip_referers CHANGE visites_jour visites_veille INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',CHANGE visites_veille visites_jour INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
                        #spip_query("UPDATE spip_referers SET visites_jour=0");
                        // version 4 fois plus rapide que la premiere, en une seule requete
-                 // ATTENTION : peut poser probleme cf http://core.spip.org/issues/2505
+                 // ATTENTION : peut poser probleme cf https://core.spip.net/issues/2505
                        sql_alter("TABLE spip_referers DROP visites_veille,
                        CHANGE visites_jour visites_veille INT(10) UNSIGNED NOT NULL DEFAULT '0',
                        ADD visites_jour INT(10) UNSIGNED NOT NULL DEFAULT '0'");
index 7f2618a..8e789ab 100644 (file)
@@ -207,10 +207,32 @@ function calculer_visites($t) {
        }
 }
 
-//
-// Calcule les stats en plusieurs etapes
-//
-// http://code.spip.net/@genie_visites_dist
+/**
+ * Nettoyer les IPs des flooders 24H apres leur dernier passage
+ */
+function visites_nettoyer_flood(){
+       if (is_dir($dir=_DIR_TMP.'flood/')){
+               include_spip('inc/invalideur');
+               if (!defined('_IP_FLOOD_TTL')) define('_IP_FLOOD_TTL',24*3600); // 24H par defaut
+               $options = array(
+                       'mtime' => $_SERVER['REQUEST_TIME'] - _IP_FLOOD_TTL,
+               );
+               purger_repertoire($dir,$options);
+       }
+}
+
+
+/**
+ * Cron de calcul de statistiques des visites
+ * 
+ * Calcule les stats en plusieurs étapes
+ * @uses calculer_visites()
+ * 
+ * @param int $t
+ *     Timestamp de la dernière exécution de cette tâche
+ * @return int
+ *     Positif si la tâche a été terminée, négatif pour réexécuter cette tâche
+**/
 function genie_visites_dist($t) {
        $encore = calculer_visites($t);
 
@@ -219,6 +241,9 @@ function genie_visites_dist($t) {
        if ($encore)
                return (0 - $t);
 
+       // nettoyer les IP des floodeurs quand on a fini de compter les stats
+       visites_nettoyer_flood();
+
        return 1;
 }
 ?>
index 8959bae..8128e74 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="stats"
        categorie="statistique"
-       version="0.4.27"
+       version="0.4.34"
        etat="stable"
        compatibilite="[3.0.0;3.1.*]"
        logo="prive/themes/spip/images/statistique-32.png"
index ed69458..b9b5bc8 100644 (file)
@@ -92,4 +92,7 @@ table#visites tr.c_recap th {background-color:#[(#GET{foncee}|couleur_foncer)];c
 .stats_repartition table table td {padding: 0;}
 .stats_lang .couleur_langue { background: #GET{foncee}; }
 .stats_lang table p {padding-left:10px;margin:2px 0;}
+
+.stats-articles .size1of2 {padding-#GET{right}:1%;}
+.stats-articles .lastUnit {padding-#GET{left}:1%;border-#GET{left}:1px solid;}
 [(#REM)        </style>]
index 11a755f..4cb6d1a 100644 (file)
@@ -87,6 +87,10 @@ function public_stats_dist() {
 
                ecrire_fichier($fichier, serialize($content));
        }
+       else {
+               $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
+               @touch($flood);
+       }
 }
 
 ?>
index b2326ec..a3dcc18 100644 (file)
@@ -420,36 +420,45 @@ class Decideur {
         *     tableau de description du paquet le plus récent sinon
         */
        function chercher_plugin_compatible($prefixe, $version) {
-               
+               $plugin = array();
+
                // on choisit en priorite dans les paquets locaux !
                $locaux = $this->infos_courtes(array(
                        'pl.prefixe=' . sql_quote($prefixe),
                        'pa.obsolete=' . sql_quote('non'),
                        'pa.id_depot='.sql_quote(0)), true);
                if ($locaux and isset($locaux['p'][$prefixe]) and count($locaux['p'][$prefixe]) > 0) {
+                       $v = '000.000.000';
                        foreach ($locaux['p'][$prefixe] as $new) {
                                if (plugin_version_compatible($version, $new['v'])
-                               and svp_verifier_compatibilite_spip($new['compatibilite_spip']) ){
-                                       return $new;
+                               and svp_verifier_compatibilite_spip($new['compatibilite_spip'])
+                               and ($new['v'] > $v)){
+                                       $plugin = $new;
+                                       $v = $new['v'];
                                }
                        }
                }
-               
-               // sinon dans les paquets distants
-               $distants = $this->infos_courtes(array(
-                       'pl.prefixe=' . sql_quote($prefixe),
-                       'pa.obsolete=' . sql_quote('non'),
-                       'pa.id_depot>'.sql_quote(0)), true);
-               if ($distants and isset($distants['p'][$prefixe]) and count($distants['p'][$prefixe]) > 0) {
-                       foreach ($distants['p'][$prefixe] as $new) {
-                               if (plugin_version_compatible($version, $new['v'])
-                               and svp_verifier_compatibilite_spip($new['compatibilite_spip']) ){
-                                       return $new;
+
+               if (!$plugin) {
+                       // sinon dans les paquets distants
+                       $distants = $this->infos_courtes(array(
+                               'pl.prefixe=' . sql_quote($prefixe),
+                               'pa.obsolete=' . sql_quote('non'),
+                               'pa.id_depot>'.sql_quote(0)), true);
+                       if ($distants and isset($distants['p'][$prefixe]) and count($distants['p'][$prefixe]) > 0) {
+                               $v = '000.000.000';
+                               foreach ($distants['p'][$prefixe] as $new) {
+                                       if (plugin_version_compatible($version, $new['v'])
+                                       and svp_verifier_compatibilite_spip($new['compatibilite_spip'])
+                                       and ($new['v'] > $v)){
+                                               $plugin = $new;
+                                               $v = $new['v'];
+                                       }
                                }
                        }
                }
-               
-               return false;
+
+               return ($plugin ? $plugin : false);
        }
 
 
index 2ce2688..d539741 100644 (file)
@@ -101,7 +101,7 @@ function svp_ajouter_depot($url, &$erreur='') {
        // On vide les paquets locaux pour mettre a jour leurs donnees relatives au depot
        // comme les mises a jour disponibles
        include_spip('inc/svp_depoter_local');
-       svp_base_supprimer_paquets_locaux();
+       svp_actualiser_paquets_locaux(true);
        
        return true;
 }
index e9c74d4..5a1e0e0 100644 (file)
@@ -509,29 +509,37 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) {
        if ($ids_plugin) {
                $where[] = sql_in('pl.id_plugin', $ids_plugin);
        }
-       
+
        // comme l'on a de nouveaux paquets locaux...
        // certains sont peut etre devenus obsoletes
        // parmis tous les plugins locaux presents
        // concernes par les memes prefixes que les plugins ajoutes.
        $obsoletes = array();
        $changements = array();
-       
+
        $paquets = sql_allfetsel(
-               array('pa.id_paquet', 'pl.prefixe', 'pa.version', 'pa.etatnum', 'pa.obsolete'),
+               array('pa.id_paquet', 'pl.prefixe', 'pa.version', 'pa.etatnum', 'pa.obsolete', 'pa.compatibilite_spip'),
                array('spip_paquets AS pa', 'spip_plugins AS pl'),
                $where);
 
+       // L'obsolescence doit tenir compte de la compatibilité avec notre version de SPIP en cours
+       foreach ($paquets as $c => $p) {
+               $paquets[$c]['compatible'] = plugin_version_compatible($p['compatibilite_spip'], $GLOBALS['spip_version_branche'], 'spip');
+       }
+
        foreach ($paquets as $c => $p) {
 
                $obsoletes[$p['prefixe']][] = $c;
 
-               // si 2 paquet locaux ont le meme prefixe, mais pas la meme version,
+               // si 2 paquet locaux ont le meme prefixe,
+               // sont compatibles avec notre SPIP,
+               // mais pas la meme version,
                // l'un est obsolete : la version la plus ancienne
                // Si version et etat sont egaux, on ne decide pas d'obsolescence.
                if (count($obsoletes[$p['prefixe']]) > 1) {
                        foreach ($obsoletes[$p['prefixe']] as $cle) {
                                if ($cle == $c) continue;
+                               if (!$paquets[$c]['compatible']) continue;
 
                                // je suis plus petit qu'un autre
                                if (spip_version_compare($paquets[$c]['version'], $paquets[$cle]['version'], '<')) {
@@ -545,7 +553,7 @@ function svp_corriger_obsolete_paquets($ids_plugin = array()) {
 
                                // je suis plus grand ou egal a un autre...
                                else {
-                                       // je suis plus strictement plus grand a un autre...
+                                       // je suis strictement plus grand qu'un autre...
                                        if (spip_version_compare($paquets[$c]['version'], $paquets[$cle]['version'], '>')) {
                                                // si mon etat est meilleur, rendre obsolete les autres
                                                if ($paquets[$c]['etatnum'] >= $paquets[$cle]['etatnum']) {
index 0955738..e48afe4 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="svp"
        categorie="maintenance"
-       version="0.80.22"
+       version="0.80.27"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="svp-64.png"
index 3441c0c..854e29b 100644 (file)
@@ -507,7 +507,9 @@ function traiter_modeles($texte, $doublons=false, $echap='', $connect='', $liens
                                $lien = array(
                                        'href' => extraire_attribut($r[0],'href'),
                                        'class' => extraire_attribut($r[0],'class'),
-                                       'mime' => extraire_attribut($r[0],'type')
+                                       'mime' => extraire_attribut($r[0],'type'),
+                                       'title' => extraire_attribut($r[0],'title'),
+                                       'hreflang' => extraire_attribut($r[0],'hreflang')
                                );
                                $n = strlen($r[0]);
                                $a -= $n;
@@ -541,6 +543,8 @@ function traiter_modeles($texte, $doublons=false, $echap='', $connect='', $liens
                                                $contexte['lien'] = str_replace("&quot;",'"', $lien['href']);
                                                $contexte['lien_class'] = $lien['class'];
                                                $contexte['lien_mime'] = $lien['mime'];
+                                               $contexte['lien_title'] = $lien['title'];
+                                               $contexte['lien_hreflang'] = $lien['hreflang'];
                                        }
                                        $modele = recuperer_fond("modeles/dist", $contexte, array(), $connect);
                                }
index a63ddd9..3504bd4 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="urls"
        categorie="statistique"
-       version="1.4.25"
+       version="1.4.26"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/url-32.png"
index e06f122..3ce5d55 100644 (file)
@@ -382,7 +382,7 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
                } else {
                        // Si ca ressemble a une URL d'objet, ce n'est pas la home
                        // et on provoque un 404
-                       if (preg_match(',^.*/[^\.]+(\.html)?$,', $url)) {
+                       if (preg_match(',^[^\.]+(\.html)?$,', $url)) {
                                $entite = '404';
                                $contexte['erreur'] = '';
 
index b076b93..7bc99da 100644 (file)
                                <label for="#GET{name}">[(#ENV{_label_date})] #AIDER{artdate}</label>[
                                <span class='erreur_message'>(#GET{erreurs})</span>
                                ]
-                               <span class="affiche"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate)]</span>
+                               <span class="affiche"[(#ENV{_saisie_en_cours}|et{#ENV{_editer_date}}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate)]</span>
        [(#ENV{editable})
                                <span class="toggle_box_link"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>&#91;<a href="#"
-                                               onclick="var f=jQuery(this).parents('form').eq(0);f.find('li .input').show('fast').siblings('span').hide('fast');f.find('.boutons').show('fast');f.find('input.date').eq(0).focus();return false;"
+                                               onclick="var f=jQuery(this).parents('form').eq(0);f.find('.editer .input.editable').show('fast').siblings('span').add(jQuery(this).parent()).hide('fast');f.find('.boutons').show('fast');f.find('input.date').eq(0).focus();return false;"
                                                ><:bouton_changer:><i class="over"> \(#ENV{_label_date}\)</i></a>&#93;</span>
-                               <span class="input"[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
+                               <span class="input[(#ENV{_editer_date}|oui)editable]"[(#ENV{_saisie_en_cours}|et{#ENV{_editer_date}}|non)style="display:none;"]>
                                        <input type="text" class="text date" name="#GET{name}_jour" id="#GET{name}_jour" value="#ENV{#GET{name}_jour}" size="10"/>
                                        <input type="text" class="text heure time" name="#GET{name}_heure" id="#GET{name}_heure" value="#ENV{#GET{name}_heure}" size="5"/>
                                </span>
@@ -32,7 +32,7 @@
                                        ]
                                        <span class="affiche"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate|sinon{<:jour_non_connu_nc:>})]</span>
        [(#ENV{editable})
-                                       <span class="input"[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
+                                       <span class="input editable"[(#ENV{_saisie_en_cours}|non)style="display:none;"]>
                                                <span class="saisie_redac"[(#ENV{sans_redac}|oui)style="display:none;"]>
                                                        <input type="text" class="text date" name="#GET{name}_jour" id="#GET{name}_jour" value="#ENV{#GET{name}_jour}" size="10"/>
                                                        <input type="text" class="text heure time" name="#GET{name}_heure" id="#GET{name}_heure" value="#ENV{#GET{name}_heure}" size="5"/>
index 9b6d65d..230063e 100644 (file)
@@ -100,6 +100,12 @@ function formulaires_dater_charger_dist($objet, $id_objet, $retour='', $options=
        $valeurs['_label_date'] = (($statut == 'publie')? _T('texte_date_publication_objet'): _T('texte_date_creation_objet'));
        $valeurs['_saisie_en_cours'] = (_request('date_jour')!==null);
 
+       // cas ou l'on ne peut pas dater mais on peut modifier la date de redac anterieure
+       // https://core.spip.net/issues/3494
+       $valeurs['_editer_date'] = $valeurs['editable'];
+       if ($valeurs['_editer_date_anterieure'] AND !$valeurs['editable']){
+               $valeurs['editable'] = autoriser('modifier',$objet,$id_objet);
+       }
        return $valeurs;
 }
 
@@ -175,14 +181,19 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
 
                $set = array();
 
-               if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
-                       $d = array(date('Y'),date('m'),date('d'));
-               if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
-                       $h = array(0,0);
+               $charger = charger_fonction("charger","formulaires/dater/");
+               $v = $charger($objet, $id_objet, $retour, $options);
+
+               if ($v['_editer_date']){
+                       if (!$d = dater_recuperer_date_saisie(_request('date_jour')))
+                               $d = array(date('Y'),date('m'),date('d'));
+                       if (!$h = dater_recuperer_heure_saisie(_request('date_heure')))
+                               $h = array(0,0);
 
-               $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
+                       $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
+               }
 
-               if (isset($desc['field']['date_redac'])){
+               if (isset($desc['field']['date_redac']) AND $v['_editer_date_anterieure']){
                        if (!_request('date_redac_jour') OR _request('sans_redac'))
                                $set['date_redac'] = sql_format_date(0,0,0,0,0,0);
                        else {
@@ -193,8 +204,18 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
                                $set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
                        }
                }
-               include_spip('action/editer_objet');
-               objet_modifier($objet, $id_objet, $set);
+
+               if (count($set)){
+                       $publie_avant = objet_test_si_publie($objet,$id_objet);
+                       include_spip('action/editer_objet');
+                       objet_modifier($objet, $id_objet, $set);
+                       $publie_apres = objet_test_si_publie($objet,$id_objet);
+                       if ($publie_avant !== $publie_apres){
+                               // on refuse ajax pour forcer le rechargement de la page ici
+                               // on refera traiter une 2eme fois, mais c'est sans consequence
+                               refuser_traiter_formulaire_ajax();
+                       }
+               }
        }
 
        if ($retour)
index 3cece6e..3df5c88 100644 (file)
@@ -870,12 +870,13 @@ function parametre_url(url,c,v,sep,force_vide){
                if (p>0) a=url.substring(0,p);
                args = url.substring(p+1).split('&');
        }
-        else
-            a=url;
+       else
+               a=url;
        var regexp = new RegExp('^(' + c.replace('[]','\\[\\]') + '\\[?\\]?)(=.*)?$');
        var ajouts = [];
        var u = (typeof(v)!=='object')?encodeURIComponent(v):v;
        var na = [];
+       var v_read = null;
        // lire les variables et agir
        for(var n=0;n<args.length;n++){
                var val = args[n];
@@ -885,24 +886,34 @@ function parametre_url(url,c,v,sep,force_vide){
                var r=val.match(regexp);
                if (r && r.length){
                        if (v==null){
-                               return (r.length>2 && typeof r[2]!=='undefined')?r[2].substring(1):'';
+                               // c'est un tableau, on memorise les valeurs
+                               if (r[1].substr(-2) == '[]') {
+                                       if (!v_read) v_read = [];
+                                       v_read.push((r.length>2 && typeof r[2]!=='undefined')?r[2].substring(1):'');
+                               }
+                               // c'est un scalaire, on retourne direct
+                               else {
+                                       return (r.length>2 && typeof r[2]!=='undefined')?r[2].substring(1):'';
+                               }
                        }
                        // suppression
                        else if (!v.length) {
                        }
                        // Ajout. Pour une variable, remplacer au meme endroit,
                        // pour un tableau ce sera fait dans la prochaine boucle
-                       else if (r[1].substring(-2) != '[]') {
+                       else if (r[1].substr(-2) != '[]') {
                                na.push(r[1]+'='+u);
                                ajouts.push(r[1]);
                        }
-                       else na.push(args[n]);
+                       /* Pour les tableaux ont laisse tomber les valeurs de départ, on
+                       remplira à l'étape suivante */
+                       // else na.push(args[n]);
                }
                else
                        na.push(args[n]);
        }
 
-       if (v==null) return v; // rien de trouve
+       if (v==null) return v_read; // rien de trouve ou un tableau
        // traiter les parametres pas encore trouves
        if (v || v.length || force_vide) {
                ajouts = "="+ajouts.join("=")+"=";
index e9619a8..64ef2d2 100644 (file)
@@ -27,7 +27,7 @@
                                        var contenu = $(this).serialize();
                                        // ajoutons un timestamp
                                        var d=new Date();
-                                       contenu = contenu + "&__timestamp=" + d.getTime();
+                                       contenu = contenu + "&__timestamp=" + Math.round(d.getTime()/1000);
                                        $.post(opt.url, {
                                                'action': 'session',
                                                'var': 'autosave_' + $('input[name=autosave]', this).val(),
index c6153ce..b910a2d 100644 (file)
@@ -19,7 +19,7 @@
                </tr>
        </thead>
        <tbody>
-       <BOUCLE_liste_art(ARTICLES){id_trad}{statut==.*}{where?}{recherche?}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,10}}{!lang_select}>
+       <BOUCLE_liste_art(ARTICLES){id_trad}{statut==.*}{tout}{where?}{recherche?}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,10}}{!lang_select}>
                <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
                        <td class='statut'>[(#STATUT|puce_statut{article,#ID_ARTICLE,#ID_RUBRIQUE})]</td>
                        <td class="trad">[(#ENV{id_trad}|=={#ID_ARTICLE}|oui)[(#CHEMIN_IMAGE{langue-16.png}|balise_img)]]
index c34d224..a793bca 100644 (file)
@@ -26,7 +26,7 @@
                        <td class='titre principale'>[(#LOGO_ARTICLE|image_reduire{20,26})]<a href="[(#ID_ARTICLE|generer_url_entite{article})]"
                                                                                                                                                                                                                                                                                                                title="<:info_numero_abbreviation|attribut_html:> #ID_ARTICLE">[(#RANG). ]#TITRE</a> [(#ENV{lang}|=={#LANG}|non) &#40;#LANG&#41;]</td>
                        <td class='auteur'><div class="inner"><BOUCLE_auteurs(AUTEURS){id_article}{', '}><a href="[(#ID_AUTEUR|generer_url_entite{auteur})]">#NOM</a></BOUCLE_auteurs></div></td>
-                       <td class='date secondaire'>[(#DATE|affdate_jourcourt)]</td>
+                       <td class='date secondaire'>[<span title="[(#DATE|heures_minutes)]">(#DATE|affdate_jourcourt)</span>]</td>
                        <td class='id'>[(#AUTORISER{modifier,article,#ID_ARTICLE}|?{
                                <a href="[(#URL_ECRIRE{article_edit,id_article=#ID_ARTICLE})]">#ID_ARTICLE</a>,
                                #ID_ARTICLE
index dcd9319..b6bc56a 100644 (file)
@@ -4,4 +4,4 @@
 
 ]
 #SET{zajax,#VAL{var_zajax}|_request|replace{\W,''}}
-<INCLURE{fond=prive/squelettes/#GET{zajax}|concat{'/',#ENV{type-page}},ajax=#GET{zajax},env}>
\ No newline at end of file
+<INCLURE{fond=prive/squelettes/#GET{zajax}|concat{'/',#ENV{type-page}},ajax=#GET{zajax},espace_prive=1,env}>
\ No newline at end of file
index d770c45..9dc5b63 100644 (file)
@@ -8,4 +8,4 @@
 [(#REM) Si pas de title, celui ci sera mis automatiquement par f_title_auto
 en capturant le premier <h1> de la page]
 #SET{paramcss,#REM|parametres_css_prive}
-#PIPELINE{header_prive,#INCLURE{fond=prive/squelettes/inclure/head,titre,minipres,paramcss=#GET{paramcss}}}
\ No newline at end of file
+#PIPELINE{header_prive,#INCLURE{fond=prive/squelettes/inclure/head,titre,minipres,paramcss=#GET{paramcss},espace_prive}}
\ No newline at end of file
index b9dd987..7520bd8 100644 (file)
@@ -8,7 +8,7 @@
 <!--[if IE 9 ]>    <html class="[(#LANG_DIR)][ (#LANG)] no-js ie ie9 lte9" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR"> <![endif]-->
 <!--[if (gt IE 9)|!(IE)]><!--> <html class="[(#LANG_DIR)][ (#LANG)] no-js" xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR"> <!--<![endif]-->
 <head>
-<INCLURE{fond=prive/squelettes/head/#ENV{type-page},env}>
+<INCLURE{fond=prive/squelettes/head/#ENV{type-page},env,espace_prive=1}>
 </head>
-<INCLURE{fond=prive/squelettes/body,env}>
+<INCLURE{fond=prive/squelettes/body,env,espace_prive=1}>
 </html>
index 2fd5a1e..b31dcdf 100644 (file)
@@ -101,7 +101,7 @@ select { font-size: 120%; }
 #infos_etapes { height: 63px; overflow: hidden; margin: 0; padding: 0; padding-left: 10px; background: #8c8c8c url(images/degrade-etapes-clair-left.gif) no-repeat right top; text-align: left; list-style: none; }
 #infos_etapes.infos_etape_4 { background-image: url(images/degrade-etapes-vert-left.gif); background-color: green; }
 #infos_etapes li { float: left; margin-left: -28px; padding-left: 29px; background: url(images/degrade-etapes-fonce-left.gif) no-repeat left top; color: #555; text-align: left; font-size: .9em; line-height: 1.05em; }
-#infos_etapes li .fond { width: 100px; height: 69px; padding-right: 30px; padding-top: 10px; background: url(images/degrade-etapes-fonce-left.gif) no-repeat -30px top; }
+#infos_etapes li .fond { width: 105px; height: 69px; padding-right: 25px; padding-top: 10px; background: url(images/degrade-etapes-fonce-left.gif) no-repeat -30px top; }
 #infos_etapes li em {float:left;position:absolute;top:-1000px;}
 #infos_etapes li span.numero_etape { float: left; display: block; height: 50px; margin-left: -10px; padding: 7px 3px 0 3px; font-weight: bold; font-size: 3em; }
 #infos_etapes li.on { background-image: url(images/degrade-etapes-vert-left.gif); color: #fff; font-weight: bold; }
index b637143..8a90474 100644 (file)
@@ -7,6 +7,7 @@
 
 User-agent: *
 Allow:    /local/cache-css/
+Allow:    /local/cache-js/
 Disallow: /local/
 Disallow: /ecrire/
 Disallow: /plugins-dist/
@@ -17,4 +18,4 @@ Disallow: /squelettes-dist/
 Disallow: /squelettes/
 Crawl-delay: 1
 
-Sitemap: #URL_SITE_SPIP/sitemap.xml
\ No newline at end of file
+Sitemap: #URL_SITE_SPIP/sitemap.xml
index dc43297..18a77d5 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
-Origine: svn://trac.rezo.net/spip/tags/spip-3.0.19
-Revision: 22089
-Dernier commit: 2015-05-09 01:22:56 +0200 
+Origine: svn://trac.rezo.net/spip/tags/spip-3.0.21
+Revision: 22462
+Dernier commit: 2015-10-31 22:17:30 +0100 
 </text_version>
-<origine>svn://trac.rezo.net/spip/tags/spip-3.0.19</origine>
-<revision>22089</revision>
-<commit>2015-05-09 01:22:56 +0200 </commit>
+<origine>svn://trac.rezo.net/spip/tags/spip-3.0.21</origine>
+<revision>22462</revision>
+<commit>2015-10-31 22:17:30 +0100 </commit>
 </svn_revision>
\ No newline at end of file