On ajoute un argument $phpauth aux fonctions d'auth, qui est a true quand la fonction est appelee depuis lire_php_auth
Pas de rupture de compat car si la methode ignore cet argument c'est qu'elle n'en a pas besoin
On corrige ici mais ce probleme est suceptible de se produire partout ou sql_quote est utilisé sans type.
(Rien que pour cette raison on a toujours interet à preferer utiliser sql_updateq qui s'appuie sur le type des champs plutot que sql_updaqe+sql_quote sans type)
- OK avec Chrome
- OK dans FF
- OK avec Safari, mais bug suspect de cache navigateur : sur la redirection apres auth http, on retourne sur une page de login sans auth car safari ressert du cache (un var dump des $SERVER montre une auth vide). Il suffit alors de faire un hit manuel pour aller dans ecrire/
- suppression de la balise dynamique car le formulaire CVT #FORMULAIRE_INSCRIPTION se suffit a lui meme
- suppression du second argument non documenté 'focus' de #FORMULAIRE_INSCRIPTION
- retablissement de la transmission de id en deuxieme argument de #FORMULAIRE_INSCRIPTION (ce qui permet d'inscrire des admins restreints sur une rubrique pré-définie, a condition de surcharger certaines fonctions d'inscription)
- depollution du champ bio des nouveaux inscrits : on stocke le statut en attente dans le champs prefs qui est vide jusqu'à la première connexion. Cela permet de ne pas gêner les sites qui affichent le champ #BIO de tous les inscrits du site.
- les fonctions de test du statut d'inscription et de confirmation a la premiere connexion sont regroupées dans action/inscrire_auteur
- upgrade de la base pour deplacer le statut en attente de bio vers prefs sur les inscrits non confirmés
on renomme de façon cohérente pour tous les objets
xxx_inserer
xxx_modifier
xxx_instituer
Les points d'entrée de l'API sont donc
action_editer_xxx pour le traitement global d'un post
xxx_inserer et xxx_modifier pour les operations elementaires
xxx_instituer n'est pas un point d'entree et ne devrait pas etre appelee en direct : il faut passer par xxx_modifier.
Le fichier inc/modifier contenait de façon centralisee des fonctions
revision_xxx pour les objets historiques de SPIP (essentiellement utilisées par les crayons)
Cette construction centralisée n'est pas facilement extensible. On evacue donc chaque fonction dans le action/edtier_xxx de l'objet concerné, et on propose en remplacement un point d'entrée unique
revision_objet($objet,$id,$c)
qui va dispatcher vers la fonction xxx_modifier de l'objet, ou a defaut la fonction generique objet_modifier de
action/editer_objet. Les fonctions revision_xxx sont par ailleurs dépréciées.
Les anciennes fonctions insert&set sont toujours definies et renvoie vers la fonction a nommage conventionnel, pour eviter trop de rupture de compatibilité
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;,
}}}
et permettra aussi de gerer les liens auteur sur n'importe quel objet. On a en plus un champ vu sur la table de liaison, qui est utilise dans la messagerie.
On pourra avoir plus tard un champ role permettant de distinguer les roles des auteurs.
Ce premier commit met a jour toutes les requetes SQL, et prend en charge l'upgrade de la base.
Mais il n'est pas encore totalement fonctionnel.
debug a suivre.
auth_url_retour_login() fournit une url securisee pour retour apres identification chez un sso
auth_terminer_identifier_login() appelee au retour sur l'url precedente finit l'identification apres le retour du sso
auth_loger() loge un auteur decrit par son tableau
action/auth gere le retour depuis un SSO
la fonction charger du formulaire de login() retrouve aussi le login si on est identifie mais sans cookie admin, et lance dans ce cas la redirection necessaire
cette predisposition concerne le format et les arguments des fonctions, mais d'autres couches liees a l'auth sont a repenser pour en arriver a vraiment pouvoir se loger sur une base distante.
dans la methode spip, le js serialise ces deux dernieres dans le mot de passe, qui est du coup decompose a l'arrive pour retrouver les 2 hash si il ressemble.
Cela exclu l'utilisation, assez theorique, d'un mot de passe ressemblant a la serialisation, de la forme de 2 md5 separes par un ; et entre 2 accolades.
corrolairement, le js qui sert a encrypter le pass en md5 passe dans auth/spip car il est propre a cette methode.
+correction d'un bug sur la fonction de synchronisation lorsqu'elle est appelee sans argument : la definition de valeurs par defaut n'est pas prise en compte par func_get_args qui renvoie uniquement les arguments explicitements fournis
Cette derniere regenere tous les acces, mais il y aurait moyen de faire mieux en ne mettant a jour que l'acces modifie qui est passe en arg.
Legere modification de l'api auth_synchroniser_distant qui peut etre appelee sans argument pour forcer une resynchro de toutes les methodes et acces
apres une operation en base.
Je rétablis donc les appels à cette fonction, mais à present elle tient compte de la méthode d'authentification exigée par SPIP et ne se limite donc plus au LDAP. Par ailleurs, les appels aux fonctions {{{auth_http}}} et {{{verifier_php_auth}}} induisaient des redondances de tests, et ces fonctions n'avaient rien à faire dans le fichier inc/actions. On remplace donc leur appel par un exécution directe de leur corps, simplifié en fonction du contexte.
lors de la verification, on ne verifie plus le login separement du mot de passe car certaines methodes ne peuvent retrouver que les deux ensemble
par ailleurs, cela renforce la securite en n'informant plus sur l'existence ou non d'un login (#1758)
de la meme facon,
page=informer_auteur&var_login=xx
ne renvoie plus rien si le login n'existe pas (mais il faudrait encore ameliorer en envoyant un faux salt calcule selon le login)
- depuis le passage en Ajax du formulaire de login, le cas de l'auteur ayant perdu ses droits n'était plus signalé comme tel, et débouchait sur une redirection infinie;
- il a toujours été absurde de donner le formulaire de login lorsqu'on est dans un contexte LDAP, mais l'organisation du couple ecrire/index.php et inc/auth.php ne permettait pas de surcharger quelque chose permettant de l'éviter.
On reprend donc une fois encore (cf [11727]) les specs de inc_auth dont le résultat à la signification suivante:
* la chaine vide si autorisation à pénétrer dans l'espace privé (rien de changé sur ce point essentiel);
* une URL (chaine non vide) vers quoi se rediriger (i.e. formulaire de login);
* un nombre en cas d'erreur SQL (savoir: le numéro de l'erreur);
* un tableau (issu d'un Select SQL) décrivant le condamné:
* avec index 'statut': visiteur rêvant au graal de l'espace privé;
* sans cet index: auteur déchu.