Salut, je souhaite signaler un problème que j’ai rencontré lors du téléchargement de fichiers ou d’images dans des messages privés de chat.
Lorsque l’Utilisateur A télécharge le Fichier A dans une publication ou un chat, cela fonctionne correctement et le fichier est enregistré comme il se doit.
Mais lorsque l’Utilisateur B télécharge le Fichier A puis essaie de le télécharger à nouveau dans un autre chat :
Si l’Utilisateur B envoie le fichier sans texte, il reçoit une erreur :
Message is too short, must have a minimum of 1 character.
Si l’Utilisateur B envoie le fichier avec du texte, seul le texte est envoyé — la pièce jointe est manquante.
Cependant, si l’Utilisateur A re-télécharge le même fichier, cela fonctionne correctement et le fichier est inclus dans le message.
Ma question :
Est-ce le comportement prévu, où seul l’utilisateur d’origine peut réutiliser un fichier téléchargé ? Ou d’autres utilisateurs devraient-ils également pouvoir télécharger et envoyer le même fichier dans le chat ?
J’ai mis un certain temps à examiner cela, mais je pense avoir trouvé la cause. Je pense que cela a à voir avec ce code :
def fetch_uploads(params:, guardian:)
return [] if !SiteSetting.chat_allow_uploads
guardian.user.uploads.where(id: params.upload_ids) # Spécifiquement, ici
end
Lorsqu’un nouveau message de chat est créé, cette méthode est appelée pour récupérer les pièces jointes à associer au message. Possiblement pour garantir la propriété, la méthode passe par l’utilisateur du Guardian pour récupérer les pièces jointes afin de n’autoriser que celles appartenant à cet utilisateur.
Le problème est que les pièces jointes sont dédupliquées, comme on peut le voir ici :
# avons-nous déjà cette pièce jointe ?
@upload = Upload.find_by(sha1: sha1)
# ...
# renvoie la pièce jointe précédente s'il y en a une
if @upload
add_metadata!
UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
return @upload
end
Je pense qu’une solution possible serait de passer par les UserUploads au lieu de considérer uniquement les pièces jointes appartenant à l’utilisateur. UserUpload lie les pièces jointes à plusieurs utilisateurs, ce qui semble être ce dont nous avons besoin. Je ne suis pas encore sûr à 100 % de la manière de le faire correctement ; il se fait tard, donc je vais me coucher, mais si personne d’autre ne le corrige, j’essaierai de revenir plus tard pour travailler sur une PR.
Je vois que certains tests ont échoué, mais ce ne sont pas des tests que j’ai modifiés. J’ai également eu des problèmes pour exécuter les tests dans ces fichiers localement - j’ai obtenu les mêmes erreurs de clé dupliquée que celles que je vois ici… Je ne suis pas sûr si c’est moi qui ai cassé quelque chose ou si les tests sont parfois instables…
Oui, ce ne sont que des erreurs aléatoires et autres erreurs aléatoires, vos modifications sont bonnes. Je relance les tests de la PR, si elle passe ou échoue simplement avec la même erreur de séquence aléatoire, j’approuverai + fusionnerai.