[Communication] Vérifier l'auteur d'un message avant delete #46

Closed
opened 2020-10-31 18:09:28 +01:00 by Sulley · 5 comments
Owner

Tu ne vérifies pas non plus si le message appartient à l'utilisateur qui l'a écrit ;-)

> Alice écrit un message et le sauve
> Le message porte l'identifiant 301
> Bob se connecte et appelle l'URL /delete/301
> Le message 301 est supprimé et Alice n'en sait rien.
Tu ne vérifies pas non plus si le message appartient à l'utilisateur qui l'a écrit ;-) ``` > Alice écrit un message et le sauve > Le message porte l'identifiant 301 > Bob se connecte et appelle l'URL /delete/301 > Le message 301 est supprimé et Alice n'en sait rien. ```
Sulley added the
enhancement
label 2020-10-31 18:09:28 +01:00
Owner

Yop,

la seconde partie de la condition pour la fonction is_read n'est peutetre pas utile, dans la lesure ou cela signifierait que l'on aurait lu un message dans le futur?

A toi de voir ;-)

Yop, la seconde partie de la condition pour la fonction is_read n'est peutetre pas utile, dans la lesure ou cela signifierait que l'on aurait lu un message dans le futur? A toi de voir ;-)
Author
Owner

Tu t'es pas trompé de ticket pour ton commentaire ?

Tu t'es pas trompé de ticket pour ton commentaire ?
Owner

si... :-(

si... :-(
Fred added this to the Revue de l'application `communication` milestone 2020-11-01 14:50:21 +01:00
Owner

Avec la dernière version de ton code, dans le fichiers communication/views.py, tu as ceci:

@login_required
@require_http_methods(["DELETE"])
def delete_message(request, messageid):
    """Supprime le message dont la clé est passée en paramètre.
    """
    try:
        Message.objects.get(pk=messageid).delete()
    except:
        return HttpResponse(400)

    return HttpResponse(200)

Si tu veux vérifier qu'un message ne peut être supprimé que par son propriétaire, il suffit de modifier le try/except avec ceci:

try:
	message = Message.objects.get(pk=messageid)
    
    if message.sender == request.user:
    	message.delete()
    else:
    	return HttpResponse(401)
except:
	return HttpResponse(400)
Avec la dernière version de ton code, dans le fichiers `communication/views.py`, tu as ceci: ```python @login_required @require_http_methods(["DELETE"]) def delete_message(request, messageid): """Supprime le message dont la clé est passée en paramètre. """ try: Message.objects.get(pk=messageid).delete() except: return HttpResponse(400) return HttpResponse(200) ``` Si tu veux vérifier qu'un message ne peut être supprimé que par son propriétaire, il suffit de modifier le try/except avec ceci: ```python try: message = Message.objects.get(pk=messageid) if message.sender == request.user: message.delete() else: return HttpResponse(401) except: return HttpResponse(400) ```
Author
Owner

Hummmm… Ok, j'ai pas mal réfléchis grâce à tes différentes questions/propositions. Si on reste sur le principe (pour le moment) qu'il ne peut y avoir qu'un seul destinataire, un message lie donc deux personnes : celui qui l'écrit et celui qui va le lire.
Effacer (au sens : supprimer de la DB) ne peut être réellement fait que si les deux choisissent de l'effacer.
Si l'un des deux choisit de l'effacer, alors il faudrait le rendre invisible pour lui mais le garder en DB pour l'autre pour continuer de l'afficher dans les "messages envoyés". Dans ce contexte, il faudrait rajouter un champ ou deux pour savoir lequel des deux peut encore voir le message.

Je me rends également compte que c'est une messagerie très (trop) simpliste que j'ai mises en place. Si je veux pouvoir mettre en place une bonne messagerie il faudrait refléchir à un autre modèle, d'autres tables sans doute, … etc.

Mais procédons par étape :
1) rajouter un champ pour savoir si je peu effacer un email ou si je dois le rendre invisible pour quelqu'un
2) revoir le modèle pour envoyer à pluseurs utilisateurs à la fois, supprimer un mail d'un côté mais pas de l'autre, …

Je crée donc un jalon Communication 2.0 qui reprendra la fonctionnalité évoluées/étendues mais qui nécessiteront un refactoring complet du modèle et des vues.

Hummmm… Ok, j'ai pas mal réfléchis grâce à tes différentes questions/propositions. Si on reste sur le principe (pour le moment) qu'il ne peut y avoir qu'un seul destinataire, un message lie donc deux personnes : celui qui l'écrit et celui qui va le lire. Effacer (au sens : supprimer de la DB) ne peut être réellement fait que si les deux choisissent de l'effacer. Si l'un des deux choisit de l'effacer, alors il faudrait le rendre invisible pour lui mais le garder en DB pour l'autre pour continuer de l'afficher dans les "messages envoyés". Dans ce contexte, il faudrait rajouter un champ ou deux pour savoir lequel des deux peut encore voir le message. Je me rends également compte que c'est une messagerie très (trop) simpliste que j'ai mises en place. Si je veux pouvoir mettre en place une bonne messagerie il faudrait refléchir à un autre modèle, d'autres tables sans doute, … etc. Mais procédons par étape : 1) rajouter un champ pour savoir si je peu effacer un email ou si je dois le rendre invisible pour quelqu'un 2) revoir le modèle pour envoyer à pluseurs utilisateurs à la fois, supprimer un mail d'un côté mais pas de l'autre, … Je crée donc un jalon `Communication 2.0` qui reprendra la fonctionnalité évoluées/étendues mais qui nécessiteront un refactoring complet du modèle et des vues.
Sulley referenced this issue from a commit 2020-11-01 16:30:23 +01:00
Sign in to join this conversation.
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Sulley/khana#46
No description provided.