Le post en tant qu'invité plante lamentablement #36
Labels
No Label
Core
bug
duplicate
easy
enhancement
help wanted
invalid
performance
proposal
question
security
warning
wontfix
No Milestone
No Assignees
4 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: devs/PCv5#36
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
C'est pas implémenté. À faire donc.
Comment on implémente ça ?
On crée un utilisateur invité à qui on attribue les posts ?
Ou on joue avec le type d'utilisateur "Invité" de flask-login, pour ne pas avoir à ajouter un utilisateur par défaut à la bdd ?
Comment on gère la réattribution d'un post ? Genre je post alors que je n'ai pas de compte puis, un jour j'en crée un, et je demande la propriété de mes posts en invité. On fait comment ? Un admin va devoir le faire à la main ? Un bouton ajouté au message des invités permet de demander l'attribution un post ?
Les posts postés en invité sont attribués à une instance de
Guest
(on réutilise une instance existante si le nom et l'IP sont les mêmes, sinon on en crée une autre).Si tu crées un compte, tu ne peux a priori pas réclamer les posts parce qu'il n'y a pas de preuve que c'est toi qui les as faits. Éventuellement si ton IP est identique à celle d'une partie des posts on peut te les attribuer, mais pas mieux.
On peut pas demander un mail pour les posts invités ? C'est assez courant, sur les blogs par exemple.
Si effectivement, et d'ailleurs on le fait déjà en ce moment. Même si tu peux mettre n'importe quoi...
On peut déjà prendre la solution du mail pour attribuer les posts, et afficher une erreur si le mail est déjà utilisé en bdd.
Qu'est-ce que
Guest
? Et comment gérer plusieurs instances deGuest
?Pour la première question,
/app/models/users.py
. Pour la seconde, c'est juste deux objets différents de typeGuest
(deux entrées dans la bdd).En gros, c'est facile :
g = Guest(...)
) et tu lui donnes le post.Après faut ajouter le post et l'utilisateur à la bdd et commit.
Mais est-ce que finalement c'est si utile que ça de stocker l'IP de chaque invité ayant posté un message ?
En gros je me demande si remplacer l'IP par un
token
secret ne permettrait pas d'attribuer avec plus de fiabilité des posts, tout en étant compatible RGPD.Dans le système que j'imagine, on met un champ « Pseudo » et un champ « Token ». Le pseudo est affiché, le token reste secret (il peut s'agir d'un email). On indique sous le token que ce dernier sert à faire valoir ses droits sur les données (récupération, édition, suppression), et donc que si il n'y en a pas vous renoncez à les faire valoir, et si y'en a un vous le gardez précieusement.
Quand un nouveau compte est créé avec un pseudo d'invité, on demande le token utilisé. Si des contenus matchent au niveau pseudo + token, on les associe au nouveau compte. Les autres restent attribués à des Guest, sauf action manuelle de la part d'un admin/modo qui adapterai en fonction de la situation (discussion avec le nouveau membre).
Autre méthode : on créé le compte, si ça matche avec un invité, on invite l'utilisateur a entrer en contact avec l'équipe de modération pour récupérer ses contenus. L'action est manuelle, et on peut s'adapter aux situations bizarre (pseudo squatté, plusieurs tokens, etc.). Niveau process d'inscription, ça change rien.
Avantages que j'y vois :
En ce qui concerne les logs de service et de sécurité (anti-spam, autre), je pensais utiliser de manière globale au site un InfluxDB ou Logstash, ou solution qui permet de faire de la rotation automatiquement. Comme ça les logs techniques sont séparés de la BDD, et en cas de pépin on garde ceintures, bretelles et parachute.
Si un invité veut faire valoir ses droits sur ses précédents messages, il avait qu'à s’inscrire avant… il suffit de préciser qu'un invité ne peut pas éditer ou assigner son message à un futur compte et hop. Bien plus simple à gérer. Et plus logique.
Par contre faut prévoir un truc pour lutter contre le spam (volontaire/manuel, donc un captcha suffira pas) et le contournement de blocage.
Ça t'a RGPD-ment pas le droit. Un utilisateur doit avoir un moyen d'accéder à ses données personnelles (et j'aurais tendance à dire qu'un pseudo + un message en est).
Oui, non pas pour les identifier fonctionnellement sur le site, mais pour détecter les posts abusifs, les liers avec les IPs des membres inscrits, et traquer les trolls. C'est pas contraire au RGPD, et on peut les virer après 1 an si tu veux, ce qui m'intéresse c'est les informations dans l'immédiat.
+1. Concis et suffisant.
Pour les rares cas où il est important de récupérer les données, je pense que c'est le bon plan. Mais comme une intervention manuelle est nécessaire, alors ce sera certainement pour des gens impliqués et qui peuvent justifier qu'ils ont écrit les messages bien mieux que par un token. En plus l'IP sera probablement toujours dans la base donc ça suffit largement à mon sens.
Je ne trouve pas que ta proposition soit une mauvaise idée, mais je pense que le besoin auquel ça répond est vraiment marginal.
+1. On refait pas une v42.
Limiter au niveau des IPs par exemple...
Tu borderlines sur l'impossible/le non-sens parce que le principe du post invité c'est de ne pas laisser de données personnelles (compte) derrière toi. Donc si tu prétends que le contenu d'un post invité est des données personnelles alors ce post invité est structurellement un échec.
+1
Du coup, mit en bdd dans une table spécifique ?
Je me demande si limiter au niveau de l'IP va pas causer des problèmes pour les posts légitimes rapides. Type post, et modification rapide du post.
Bon, après relecture du RGPD, je vous propose cette interprétation :
Le post en tant qu'invité avec pseudo - email - message est correct car :
Ce que je propose
Faire un post invité hyper basique. Le message n'est alors pas une donnée personnelle, donc le RGPD ne s'applique pas (sur ce point ci en tout cas).
Deux écoles :
Le cas 2 est assez drastique, mais a l'avantage d'être hyper safe d'un point de vue données personnelles.
Finalement recueillir l'email ne sert pas la finalité de base qui est « poster un contenu sans partager des données personnelles ». Donc je serais plutôt pour l'enlever.
Et bien entendu on prévient que le post en tant qu'invité, de par sa nature anonyme, ne permet pas l'édition ou la suppression à postériori.
Le plus de la fin
On peut imaginer un token JWT stocké dans un cookie/other qui permettrait à un visiteur d'éditer/supprimer ses messages tant que sa session est active. On a pas non plus de donnée personnelles dans ce cookie, donc là aussi on est bon.
Ça me paraît correct. J'ai jamais lu le RGPD, personnellement, ni même de résumé, mais ça me paraît cohérent et acceptable.
Le cas deux avec "Le plus de la fin" me va bien.
Il à l'avantage, côté technique, de ne pas demander à créer un utilisateur spécifique, ou devoir lier un pseudo, pour chaque invité.
Ce qui permet, de ne pas réserver un pseudo pour un utilisateur qui s'inscrit
Ça me va aussi, je n'ai pas d'a priori sur le plus de la fin, qui est utile d'un côté mais confus de l'autre parce que la durée de la session n'est pas un truc dont on connaît vraiment la portée et les gens ne vont pas forcément comprendre pourquoi ils ne peuvent soudain plus éditer leurs messages. Faites comme vous préférez.
Reste pour moi la question de l'IP, où j'ai vu Darks dire "L'IP c'est un truc à part qui n'est pas spécifique au post invité" ; tant qu'elle est quelque part je n'ai rien à ajouter.
Je propose de renouveler la durée de vie du cookie à chaque message posté, de manière à ce que l'édition d'un message précédemment posté soit simple tant que l'utilisateur reste actif, je pense à mettre une limite de temps d'un mois pour ce cookie, ça me semble largement assez.
Hum... va falloir modifier cette class en fonction de ce qu'on choisi de faire ici.
Tu peux mais c'est juste encore plus confus qu'avant. ^^"
Un message d'avertissement peut régler ça.
En postant en tant qu'invité vous ne serez en mesure de supprimer ou d'éditer vos message uniquement durant les {app_guest_edit_delay} jours après votre dernière activité
Remarque l'utilisation d'
activité
me plait pas, tu aurais pas une autre formulation ?Autant le cookie pour un message à court terme (genre 15 minutes, si le mec a fait une faute ou quoi) ça va (en gros juste le temps que la personne a la page d'ouverte à peu près), autant du long terme non. Et encore moins avec un message, parce qu'il y a tellement de raisons pour que finalement le cookie ait disparu avant…
L'avantage du cookie court terme, c'est que qu'on peut faire un pseudo-blocage (merci d'attendre avant de poster, préférez éditer votre message). Ça évitera pas le spam de bots ou d'un type qui veut vraiment spammer par tous les moyens, mais ça éviterais le multi-post. Ça ou fusion automatique comme la v42 (mais sans avoir la notif de nouveau message comme la v42 dans ce cas).
Et honnêtement, c'pas trop grave si les invités ont des fonctionnalités limitées, je veux dire, c'est un forum, si tu veux vraiment y participer tu t'inscris… si on veut proposer le post invité à la base c'est juste pour que l'étape inscription ne rebute pas un nouveau venu, il me semble.
Ok, je comprend ton point de vue, et il me va. Il me semble même mieux que mon avis précédant.
Ça vous semble bien comme message d'avertissement ?
Ça donne ça sans css, je trouve que c'est un peut long. Et je sait pas comment mettre en valeur le texte.
Je n'ai pas du tout implémenté quoi que ce soit.
De plus il semblerait que le fait que l'éditeur soit un widget m’empêche d'utiliser une variable, pourtant passé à tout les templates,
current_user
n'est pas vu par jinja lors de la génération de l'html.C'est pas mal ! Voilà une suggestion, tu en fais ce que tu veux.
Pour le mettre en valeur, je suggère une div orange type message flash. 😉
Pour le taux de spam, il suffit de le dire au cas où il est dépassé (en renvoyant la page avec une erreur et le formulaire rerempli proprement), ce que tu devras faire de toute façon.
Classe Guest
Par rapport à la classe
Guest
, à minima il faut dégager l'adresse IP (qui sera stockée ailleurs).Et limite je me demande si en effet ça serait pas plus simple de rattacher les posts à un compte « Invité ». Ça permet de dégager la classe
Guest
, de virer la polymorphie surUser → Member
, etc.Édition temporaire
Concernant l'édition temporaire des messages, un truc qui peut être jouable est d'utiliser un JWT contenant l'ID du contenu pouvant être modifié. On stocke ce JWT dans le cookie de session de l'utilisateur.
Quand l'invité poste un message, on regarde le contenu du JWT. Si il est valide (y'a un système de signature pour être sûr), on regarde si l'ID du contenu pouvant être modifié est dedans. Si c'est le cas l'édition/suppression est autorisée, sinon on annule. On peut aussi coupler ça à une vérification de la date du post pour limiter l'édition à X minutes et non à la durée de la session utilisateur.
Je suis pas chaud, ça va mettre pas mal de bordel. Il y aura plein d'IPs pour le même utilisateur, faudra exclure une unique personne de toutes les requêtes qui cherchent des membres (!!), et ça n'a pas de sens d'avoir (au hasard) des trophées pour les invités. Se débrouiller pour que les flashs/infos spécifiques aux membres n'apparaissent pas après un post invité va nous emmerder tellement dans tous les coins, j'ai vraiment pas envie d'essayer.
Ton système d'édition temporaire paraît pas mal.
Ben non. Les IP sont pas stockées par utilisateur mais par post (entre autres pour prévenir l'usurpation de compte). Donc ça change rien.
Au niveau des trophées, avec le système de contexte, c'est pas compliqué de les ignorer. Et les flash/infos spécifiques, c'est pas parce qu'un invité poste sous le compte Invité qu'il est loggué en tant qu'Invité.
Pour l'édition de post, je vais tenter de faire un PoC ce WE.
Certes, mais ça ne change pas le problème.
Il s'agit pas que des trophées. Ton invité va avoir un nom. Il va sortir dans la liste des membres. On pourra lui envoyer des MPs. On pourra le citer sur le forum. Toutes ses limites seront pour tous les invités. Il aura une page de profil avec dessus tous les topics et tous les commentaires invités du site. Il aura un compteur de points. Tous ces machins n'ont aucun sens et je ne veux surtout pas qu'on ait à rajouter des exceptions pour faire rentrer ça dans le modèle
Member
.Le modèle actuel convient très bien à ce qu'on veut même avec aucun attribut spécial dans la classe
Guest
, donc s'il te plaît ce n'est vraiment pas le truc à simplifier. UtiliseUser
directement si tu veux mais pas dans l'autre sens.J'analyse un peu plus ce qu'on pourrait avoir avec une classe
Guest
ne contenant qu'un pseudo. Je te propose un usecase classique.Darks
. Le site lui dit « Le pseudo est déjà utilisé par un membre ».Toto
. Ça passe.Toto
en tant qu'invité.Toto
.Que fait-on ? J'ai identifié ces contraintes :
<Guest Toto>
à<Member Toto>
Guest
Je vois quelques choix possibles :
Toto
etToto
avec juste une légère indication sur l'origine.Invité #ID
Z'en pensez quoi ?
Merci. Je pense que la solution 1 peut suffire, notamment si tu es un peu plus explicite, par exemple en mettant des guillemets. Invité "Toto". Ça contrasterait avec le Toto des membres, qui est un lien, et en couleur. Quitte à mettre Invité en gras je pense que la distinction est suffisament forte.
Pour la solution 2, je n'ai pas d'a priori, par contre je note que quand tu dis "on garde les fils de discussion cohérents", tu oublies peut-être qu'on se réfère souvent aux invités par leur nom, et du coup le sujet peut devenir un peu confus. (Parce que si tu mets un numéro c'est qu'un membre a maintenant le nom et du coup on va avoir à fond l'impression qu'on se réfère au membre.)
Note que dans le cas où la solution 1 est adoptée, on peut poster en invité avec n'importe quel pseudo, y compris si un membre existe déjà. Et j'appuie le fait qu'en effet, on ne peut pas réattribuer les messages invités.
Va pour la solution 1
Une autre idée est de préfixer les comptes Guest pat
Invité :
et interdire aux gens de prendre un compte commençant parInvité :
Ça me semble simple, et clair. Sans pour autant bloquer le choix de pseudo à l’inscription.(personne ne veux d'un compte préfixé deInvité :
)Ça revient à ma solution avec un autre préfixe si j'ai bien compris ? (Juste pour être sûr !)
En tous cas ça me va bien aussi, de toute façon on ne peut pas avoir un compte dont le nom commence par "Invité :" parce que les espaces et deux points ne sont pas autorisés.