[SPIP Zone] Autoriser un visiteur (6forum) à uploader un document sur son profil utilisateur (plugin formulaire upload)

Bonjour,

Je cherche à autoriser un visiteur (6forum) à uploader un document sur son profil utilisateur à partir d’une page de l’espace public via le plugin « formulaire upload ».

Dans le squelette d’une page public, j’utilise la balise #FORMULAIRE_UPLOAD du plugin Formulaire Upload (http://contrib.spip.net/Formulaire-upload?lang=fr).

Quand je suis connecté sur un compte admin, le formulaire de téléversement s’affiche bien, et les documents téléversés sont bien rattaché au profil utilisateur.

Par contre, quand je suis connecté en tant que visiteur (6forum), le formulaire ne s’affiche pas. Je pense que c’est lié aux autorisations par défaut de SPIP qui ne permettent pas à un visiteur de joindre un document d’après le « tableau des droits » dans cette doc : http://contrib.spip.net/Autorisations-Dans-Spip?lang=fr .

Je cherche donc à ajouter au profil visiteur l’autorisation de joindre un document à son profil utilisateur (objet auteur). J’ai suivi le guide sur cette doc pour surcharger une autorisation : http://programmer.spip.net/Creer-ou-surcharger-des

J’ai ajouté le code dans mes options, créé un fichier mes_autorisations.php dans squelettes/inc et j’ai surchargé la fonction autoriser_chargerftp_dist qui semble autoriser l’upload FTP (ligne 836 : https://core.spip.net/projects/spip/repository/entry/branches/spip-3.0/ecrire/inc/autoriser.php) de la manière suivante :

<?php // on modifie le statut utilisateur de 0minirezo (admin restreint) à visiteur (6forum) pour permettre à un visiteur d'uploader un document function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) { return $qui['statut'] == '6forum'; } ?>

Mais c’est sans effet, le formulaire d’upload de document ne s’affiche toujours pas quand je suis connecté en visiteur.

Est-ce que c’est la bonne approche pour faire ce que je veux ? Quelle(s) autorisation(s) faut-il surcharger ?

-Frédéric

Le 24/02/2016 23:43, Frederic Lohier a écrit :

Est-ce que c’est la bonne approche pour faire ce que je veux ? Quelle(s)
autorisation(s) faut-il surcharger ?

Est-ce que tu as vérifié que ça passe bien dans ta fonction ? (avec un var_dump() dedans par exemple)

Sinon il y a aussi parfois plusieurs autorisations à la fois. Soit il faut parcourir le code (du plugin Médias donc), soit sinon tu pourrais par exemple faire un var_dump() dans la fonction autoriser() de SPIP et recharger la page, pour savoir quelles sont les autorisation appelées pour l'afficher.

--
RastaPopoulos

ça ne serait pas ?
function autoriser_joindredocumentupload_dist
cf plugin formulaire_upload

Bonjour,

Merci, en regardant de plus près le fichier plugins/auto/formulaireupload/v1.0.5/formulaireupload_autorisations.php, j’ai modifié la fonction autoriser_joindredocumentupload_dist qui semble prévoir l’ajout/modification d’autorisation par le code ci-dessous : si le statut de l’auteur est « visiteur », la fonction autorise, sinon, on passe par la fonction d’autorisation par défaut.

Cette fois, le formulaire d’upload s’affiche bien pour le visiteur, mais lorsque je tente d’uploader un fichier, le formulaire renvoi un message de succès, le fichier est bien uploadé dans la médiathèque, mais n’est pas rattaché au profil utilisateur. Connecté en tant qu’admin, les fichiers se rattachent bien au profil utilisateur. La balise dans le squelette est simplement #FORMULAIRE_UPLOAD.

function autoriser_joindredocumentupload_dist($faire, $type, $id, $qui, $opt){

// par defaut, on reprend droits lies au plugin medias: admin et redacteur

//return autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt);

// on peut modifier ici les autorisations

// si on veut etre plus laxiste: autoriser par ex. visiteurs, … verifier la securite toutefois !

//return true;

//autoriser les visiteurs à téléverser un document

if ($qui[‹ statut ›] == ‹ 6forum ›){

return true;

}

else {

return autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt);

}

}

-Frédéric

ton formulaire est bien dans une boucle auteur ?
sinon faire #FORMULAIRE_UPLOAD{auteur, id de l’auteur}

Le formulaire n’est pas dans une boucle auteur, mais dans un bloc conditionnel du type

[(#SESSION{login}|oui)

]

J’obtiens l’id auteur avec #SESSION{id_auteur} . Je viens d’essayer avec la balise en indiquant explicitement en paramètre le type et l’id auteur :

id auteur: #SESSION{id_auteur}

//pour vérifier l’id auteur

#FORMULAIRE_UPLOAD{auteur,#SESSION{id_auteur}}

Même problème, le visiteur peut uploader, mais le fichier uploadé n’est pas rattaché à son profil/objet auteur.

Pas de problème pour un auteur avec le statut admin.

-Frédéric

essaie une boucle auteur avec #SESSION{id_auteur} et met le #FORMULAIRE_UPLOAD simple dedans pour voir

si ça passe pas essaie dans mes options

function autoriser_joindredocumentupload($faire, $type, $id, $qui, $opt){
// par defaut, on reprend droits lies au plugin medias: admin et redacteur
// return autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt);
// on peut modifier ici les autorisations
// si on veut etre plus laxiste: autoriser par ex. visiteurs, … verifier la securite toutefois !
return true;
}

J’ai intégré le formulaire upload dans une boucle auteur, les documents ne se rattachent toujours pas au profile du visiteur :

id auteur avant la boucle: #SESSION{id_auteur}

<BOUCLE_formulaire_upload(AUTEURS){statut !=5poubelle}{id_auteur=#SESSION{id_auteur}}>

id auteur dans la boucle: #ID_AUTEUR

#FORMULAIRE_UPLOAD{auteur,#ID_AUTEUR}

</BOUCLE_formulaire_upload>

[Hors sujet : il semble que la boucle AUTEURS ne retourne pas les visiteurs par défaut, j’ai dû ajouter le critère {statut !=5poubelle} vu sur le forum SPIP par une autre personne qui avait le même problème pour que la boucle me retourne les auteurs de type visiteurs].

-Frédéric

Le 25/02/2016 21:32, Frederic Lohier a écrit :

Même problème, le visiteur peut uploader, mais le fichier uploadé n’est
pas rattaché à son profil/objet auteur.

Pas de problème pour un auteur avec le statut admin.

C'est parce qu'il me semble que dans l'API de liaison, pour avoir le droit de lier un objet source (ici un document) à un autre contenu, il faut avoir *le droit de modifier ce contenu*. Donc là il faut que le visiteur ait le droit de modifier son objet auteur à lui.

Or par défaut les visiteurs n'ont pas le droit de se modifier, même pas leur propre profil donc.

Il faut donc à priori surcharger aussi autoriser_auteur_modifier() pour laisser les visiteurs se modifier soi-même (par ex mettre un code qui va dire "être admin, ou être le compte en question").

--
RastaPopoulos

Le 25/02/2016 21:53, Frederic Lohier a écrit :

[Hors sujet : il semble que la boucle AUTEURS ne retourne pas les
visiteurs par défaut, j’ai dû ajouter le critère /{statut !=5poubelle}
/vu sur le forum SPIP par une autre personne qui avait le même problème
pour que la boucle me retourne les auteurs de type visiteurs].

Plus précisément ça ne retourne pas les auteurs qui n'ont aucun contenu (ce qui est généralement le cas des visiteurs).

L'annulation du filtre par défaut se fait en ayant un critère {tout}, ou bien un critère {statut} (même si pas actif comme avec {statut?}).

--
RastaPopoulos

J’ai surchargé la fonction autoriser_auteur_modifier_dist dans le fichier config/mes_options.php via le code ci-dessous (partie que j’ai modifié/ajouté en gras). Cette fois ça marche ! Est-ce que c’est la bonne manière de surcharger cette fonction ?

// On autorise un visiteur à modifier son profil/objet auteur, on surcharge la fonction autoriser_auteur_modifier_dist qui se trouve dans ecrire/inc/autoriser.php

function autoriser_auteur_modifier($faire, $type, $id, $qui, $opt) {

// Ni admin ni redacteur => non – On desactive ce test

/*if (!in_array($qui[‹ statut ›], array(‹ 0minirezo ›, ‹ 1comite ›))) {

return false;

}

*/

// Un visiteur peut modifier ses propres donnees mais ni son login/email

// ni son statut (qui sont le cas echeant passes comme option)

if ($qui[‹ statut ›] == ‹ 6forum ›) {

if (isset($opt[‹ webmestre ›]) and $opt[‹ webmestre ›]) {

return false;

} elseif ((isset($opt[‹ statut ›]) and $opt[‹ statut ›])

or (isset($opt[‹ restreintes ›]) and $opt[‹ restreintes ›])

or $opt[‹ email ›]

) {

return false;

} elseif ($id == $qui[‹ id_auteur ›]) {

return true;

} else {

return false;

}

}

// Un redacteur peut modifier ses propres donnees mais ni son login/email

// ni son statut (qui sont le cas echeant passes comme option)

if ($qui[‹ statut ›] == ‹ 1comite ›) {

if (isset($opt[‹ webmestre ›]) and $opt[‹ webmestre ›]) {

return false;

} elseif ((isset($opt[‹ statut ›]) and $opt[‹ statut ›])

or (isset($opt[‹ restreintes ›]) and $opt[‹ restreintes ›])

or $opt[‹ email ›]

) {

return false;

} elseif ($id == $qui[‹ id_auteur ›]) {

return true;

} else {

return false;

}

}

// Un admin restreint peut modifier/creer un auteur non-admin mais il

// n’a le droit ni de le promouvoir admin, ni de changer les rubriques

if ($qui[‹ restreint ›]) {

if (isset($opt[‹ webmestre ›]) and $opt[‹ webmestre ›]) {

return false;

} elseif ((isset($opt[‹ statut ›]) and ($opt[‹ statut ›] == ‹ 0minirezo ›))

or (isset($opt[‹ restreintes ›]) and $opt[‹ restreintes ›])

) {

return false;

} else {

if ($id == $qui[‹ id_auteur ›]) {

if (isset($opt[‹ statut ›]) and $opt[‹ statut ›]) {

return false;

} else {

return true;

}

} else {

if ($id_auteur = intval($id)) {

$t = sql_fetsel(« statut », « spip_auteurs », « id_auteur=$id_auteur »);

if ($t and $t[‹ statut ›] != ‹ 0minirezo ›) {

return true;

} else {

return false;

}

} // id = 0 => creation

else {

return true;

}

}

}

}

// Un admin complet fait ce qu’il veut

// sauf se degrader

if ($id == $qui[‹ id_auteur ›] && (isset($opt[‹ statut ›]) and $opt[‹ statut ›])) {

return false;

}

// et toucher au statut webmestre si il ne l’est pas lui meme

// ou si les webmestres sont fixes par constante (securite)

elseif (isset($opt[‹ webmestre ›]) and $opt[‹ webmestre ›] and (defined(’_ID_WEBMESTRES’) or !autoriser(‹ webmestre ›))) {

return false;

} // et modifier un webmestre si il ne l’est pas lui meme

elseif (intval($id) and autoriser(‹ webmestre ›, ‹  ›, 0, $id) and !autoriser(‹ webmestre ›)) {

return false;

} else {

return true;

}

}

-Frédéric

-----Message d’origine-----