En mode url/array de securiser_action on peut lui passer un id_auteur dans l'argument $att, auquel cas l'url sera construite pour cet id_auteur précis.
PHPDoc sur securiser_action et fonctions satellites, pour expliciter/documenter les différents arguments a tiroir
La fonction calculer_action_auteur() parfois appelée directement prend aussi un $id_auteur optionnel en second argument
A contrario, le mode formulaire qui suppose une interaction avec l'auteur connecté ne peut être généré que pour celui-ci, et la verification de signature de l'action, qui s'entend aussi pour l'auteur connecté, ne peut se faire que pour celui-ci également
Je profite de cette écriture massive pour normaliser quelque chose de trompeur lorsqu'on compare deux versions, savoir l'usage de " ou ' dans le premier argument de define et defined. Comme les chaînes entre apostrophes sont plus rapidement analysées que celles entre guillemets, je choisis l'apostrophe.
Dépot obtenu avec le script Shell:
{{{
a=$(find . -name "*.php" |grep -v extensions/ | grep -v /config/ | grep -v index.php | grep -v public.php | grep -v prive.php )
echo -n "Fichiers: "
echo $a|wc -w
for i in $a
do
sed -f ~/Sites/spip/spip.sed $i > /tmp/f.php
if diff -q $i /tmp/f.php
then
:
else
diff $i /tmp/f.php
# echo $i; php /tmp/f.php
# mv /tmp/f.php $i
fi
done
}}}
et le script Sed:
{{{
s/Copyright (c) 2001-20../Copyright (c) 2001-2011/
s,\(if [(]!*\)*\(defined* *[(]\)"\([^"]*\)"\(.*\);[[:space:]]*[#/]*.*$,\1\2'\3'\4;,
}}}
on retablit l'appel des actions sans changement de repertoire, c'est definitivement le plus simple pour les ecritures du type
generer_url_action($action,$args,,self())
ou
#URL_ACTION_AUTEUR{action,arg,#SEFL}
et on corrige les quelques ecritures qui le necessitaient, sans vilain hack dans la fonction generer_url_action
la fonction generer_form_public est renommee generer_form_action puisque c'est de cela qu'il s'agit
* réintégration dans le script {{{../public.php}}} de tous les cas ne suivant pas le déroulement complet d'utilisation d'un squelette (action, CVT) afin de migrer tous les appels à {{{exit}}} de {{{public/assembler}}} dans le script initial (il en reste un, dans la fonction repérant un violation de sécurité CVT ça peut se justifier).
* abandon de la possibilité d'avoir et des actions et des formulaires CVT dont l'URL soit indifféremment au niveau de la racine ou au niveau de {{{ecrire}}}: il ne faut pas obscuricr et ralentir l'accès aux scripts de {{{ecrire/}}}.
* le traitement de la variable {{{redirect}}} dans la requête HTTP est modifié pour tenir compte des incohérences de PHP signalé dans #1510:
* si la requête est en GET, cette variable a dû être encodée par {{{rawurlencode}}}
* si la requête est en POST, elle ne doit pas avoir été encodée.
Ce traitement est assuré par {{{generer_action_auteur}}} et ses fonctions annes, les extensions de SPIP utilisant cette fonction de manière standard ne seront pas affectées par ce changement interne.
- vérification de tous les cas d'utilisation de cette variable de redirection, en particulier pour éliminer la production d'URL absolue dans le cas GET, le mod_security d'APACHE faisant de la parano là-dessus. En particulier, la solution de #1510 a imposé d'expliciter le script de retour des bouton de contrôle de forum, le double retour s'effectue à l'endroit attendu de {{{articles_forum}}}, ce qui est le cas aussi de {{{controle_forum}}} à présent, même en utilisation AJAX.
pour editer un article
charge, verifie (par md5, en renvoyant sur le meme formulaire avec message si erreur), traite
La balise ne fait pas de gestion de droit, c'est a la charge du squelette appelant de decider si l'auteur peut editer l'article
etape suivante : utiliser ce formulaire dans l'espace prive
Sur les forums par abonnement, le rendu change un peu : on ne presente plus le formulaire de login, mais un texte avec trois boutons (login) (inscription) (rappel de passe)
Sur les autres forums, formulaire libre comme avant, mais avec un bouton d connexion
Petit plus : quand on quitte une page de forum, on enregistre le message en cours dans un cookie, et on le restitue quand on revient (plugin jquery.cookie.js)
ATTENTION: $auteur_session ne garantit plus une authentification, ce n'est plus qu'une identification : pour la securite il faut tester auteur_session[statut]
Dépot obtenu par:
{{{
for i in $(grep -l 'spip_query..SELECT.*FROM.*WHERE[^A-Z]*;$' [a-i]*/*php)
do
# Pour la clause DISTINCT, laisser intact pour le moment.
sed 's/spip_query..SELECT *\([^D]*[^ ]\) *FROM *\(.*[^ ]\) *WHERE *\([^A-Z]*;\)$/sql_select("\1", "\2", "\3/;s/ "" *\.//;s/ch(sql_select\(.*\));/sel\1;/' $i > x
echo $i
mv x $i
done
#}}}
et deux suppressions manuelles de lourdeurs syntaxiques résultantes.
Pas d'intervention sur le fichier inc/meta: au test, include manquant. À controler.
En conséquence, l'annonce de [9852] est modifiée: '''spip_fetch_array''' est remplacée par '''sql_fetch'''. Rien de modifié en revanche en ce qui concerne le fait que spip_fetch_array avec un deuxième argument égal à SPIP_NUM n'a pas d'équivalent et doit être réécrit si on éviter le recours à vieilles_def.php.
Dépot obtenu par le script suivant:
{{{
grep -v '// http://doc.spip.org/@spip_abstract_' base/abstract_sql.php > b
mv b base/abstract_sql.php
for i in $(grep -l "spip_abstract_" */*p|grep -v vieilles_def)
do
sed "s/spip_abstract_/sql_/g" $i > x; mv x $i
done
}}}
et intervention manuelle sur vieilles_def.php.
Ce dépot résulte donc du retrait des deux définitions de '''spip_fetch_array''' présentes dans source:spip/ecrire/base/db_mysql.php et source:spip/ecrire/base/db_pg.php (qui peuvent donc être chargés simultanément à présent si nécessaire) et de l'application du script suivant dans le répertoire '''ecrire''':
{{{
for i in $(grep -l spip_fetch_array */*p|grep -v vieilles_def)
do
sed s/spip_fetch_array/spip_abstract_fetch/g $i > x
mv x $i
done
}}}
- la plus simple: rajouter dans leurs fichiers le {{{include_spip('inc/minipres/')}}} qui sera bientot retiré de ecrire/index.php
- la plus pertinente: tester chacun de ces fichiers pour regarder s'ils ont besoin ou non de ces 130Ko. Pour ce faire on peut utiliser le shell-script suivant, où la variable {{{session}}} doit etre affectée à une session valide sur votre machine:
#!/bin/sh
session="require('../tmp/sessions/521_0a154a3fdb1dfa9443d8cec28e7c5743.php');"
for i in ??*.php
do
z=../_$i.php
sed "s,<\?php,<\?php require 'inc_version.php';spip_connect();include_spip('inc/sessions');$session," $i > $z
f=$(basename $i .php)
echo "<?php exec_${f}_dist(); ?>" >> $z
echo ">>>>>>>>>>>>>$i"
php -q $z |grep Fatal
rm $z
done
Il faut aussi executer ce script avec {{{session=''}}} pour bien faire. Les messages de fonctions indéfinies qui pourraient arriver pendant ces exécutions signalent qu'une au moins des 4 inclusions éliminées est indispensable au script considéré, il faut alors l'ajouter à l'endroit approprié.
Le présent dépot ajoute les inclusions repérées par ce shell-script. Elle sont donc superflues jusqu'au remplacement de inc/minipres par inc/lang dans index.php.
* introduction de {{{define('_RENOUVELLE_ALEA', 3600 << 2);}}} qui détermine la validité de l'alea pour les cookie, avec conséquence automatique sur l'option "rester connecter qq jours". A n'allonger que dans des contextes où la sécurité est assurée par des voies externes mais encore plus fiables.
* migration du code en ligne danc inc/meta dans la fonction spip_initialisation de inc/utils: c'est donc cette dernière qui garantit que les meta ont été lues et l'alea est valide (sauf grosse acrobatie dans mes_options, ce changement devrait etre transparent).
* révision générale des include(inc/meta), qui n'interviennent plus que si les fonctions lire_meta, ecrire_meta ou ecrire_metas sont nécessaires dans le code qui suit.
Aussi dans ce dépot: passage en compatibilité XHTML de toutes les composantes de la page articles_edit, sauf 2 balises en majuscules écrites en dur dans les fichiers de langue, il faudra faire une passe là-dessus.