Auto purge uploads from old deleted posts

Discourse already automatically removes orphan unreferenced uploads. Why not expand this functionality and erase uploads from deleted posts? Only staff members are able to see deleted posts and that is very useful. But is it really necessary to keep all the files indefinitely? As administrator I really don`t care about 2 years old deleted pictures. Some of which may even be right out against site guidelines.

It would be nice if Discourse would automatically delete these kind old files and place some kind of text block in the place of deleted file. So that it would be evident that file deletion has taken place.

For example all year old uploads which are referenced only in deleted posts would be automatically deleted.

8 « J'aime »

J’aimerais beaucoup cela aussi.

Il semble que cette fonctionnalité soit quelque peu implémentée :

Paramètres que j’utilise :
clean orphan uploads grace period hours: 1
purge deleted uploads grace period days: 1

Un téléchargement supprimé n’inclut pas le cas d’un message supprimé contenant l’image. L’image/le téléchargement doit être supprimé du message avant la suppression, je crois.

Je peux confirmer que les images ne seront pas supprimées si le (seul) message contenant cette image spécifique a été supprimé, car j’ai des images qui existent toujours dans la base de données et S3 à partir d’un message qui a été supprimé en 2023 (l’image n’étant utilisée dans aucun autre message). Je n’ai jamais eu de suppressions pour des cas précédents non plus.

Donc, si un modérateur supprime un message parce qu’il contient une image téléchargée qui enfreint les règles, pour la supprimer réellement, il doit d’abord la supprimer du sujet/message (et espérer qu’elle n’existe dans aucun autre message). Sinon, elle existera sur S3 indéfiniment, du moins d’après ce que je comprends.

Certaines fonctionnalités qui seraient vraiment géniales :

  • purge deleted uploads grace period days - Soit ce paramètre inclut le cas d’une image contenue dans un message supprimé, soit un autre paramètre est ajouté pour ce cas.

  • purge deleted uploads grace period days - Utiliser des heures au lieu de jours. Les demandes de retrait pour violation de droits d’auteur nécessitent généralement une action extrêmement rapide, dans les 24-48 heures. 1 jour est beaucoup trop lent dans ce cas. Tout CDN cache devra probablement également être purgé manuellement après sa suppression, ce qui rend le délai encore plus serré.

  • Possibilité de supprimer/purger une image depuis le tableau de bord. Cependant, si la purge des téléchargements supprimés incluait les images dans les messages supprimés, cela serait moins nécessaire, mais il y a toujours des cas où l’image est utilisée comme avatar, ou bannière de profil, etc., ainsi que pour être plus efficace pour les modérateurs. Feature suggestion: Image removal/purge via web dashboard

  • Rendre les URL d’images consultables, cela couvrirait le cas où un modérateur pourrait trouver tous les sujets/messages contenant une image spécifique afin de supprimer également ces messages. Sans avoir besoin d’utiliser SSH.

  • La capacité d’interdire le téléchargement de certains hachages serait une bonne chose.

Ce serait bien car alors des processus comme celui-ci pourraient être gérés par quelqu’un sans accès SSH et compétences techniques. Surtout à cause de la rapidité avec laquelle ils doivent être gérés. Il est prohibitif de devoir avoir du personnel technique prêt 24h/24 et 7j/7 pour gérer tout cas de ce type, y compris tous les jours fériés, les week-ends, quand quelqu’un est malade, etc. On ne peut pas prédire quand cela se produira, il faut donc toujours être prêt à en gérer un rapidement à tout moment. C’est un attribut inévitable du UGC.

1 « J'aime »

Je me demande pourquoi ce n’est pas plus discuté ? C’est vraiment un gros problème.

J’ai écrit un script PHP qui utilise un fichier CSV généré à partir de la requête SQL suivante qui liste toutes les téléversements et leurs références :
(augmentez la limite si vous avez beaucoup de téléversements)

SELECT 
    uploads.original_filename,
    ROUND(uploads.filesize / 1000000.0, 2) AS size_in_mb,
    uploads.extension,
    uploads.created_at,
    uploads.url,
    upload_references.upload_id,
    upload_references.target_id,
    upload_references.target_type,
    upload_references.created_at,
    upload_references.updated_at
FROM upload_references
JOIN uploads ON uploads.id = upload_references.upload_id
ORDER BY upload_references.target_type
LIMIT 90000

Maintenant, ce que fait le script, c’est qu’il filtre les téléversements qui restent uniquement comme brouillons (qui restent à tort dans la base de données comme je l’ai expliqué ici). Le script génère une chaîne séparée par des espaces avec tous les noms de fichiers. Vous pouvez également modifier le script pour générer le chemin complet (supprimez la fonction basename()).

Ensuite, connectez-vous à votre serveur SSH Discourse et exécutez la commande rm pour tous les fichiers.

  • Un inconvénient est que toutes les images qui restent dans les brouillons actifs seront également supprimées (mais cela peut être limité en abaissant supprimer les brouillons plus anciens que n jours).
  • Second inconvénient - les entrées incorrectes dans la base de données persistent toujours, pour cela je devrais demander aux développeurs une correction.

Si les entrées incorrectes sont supprimées, le problème devrait être correctement résolu.

<?php 
 
if (($open = fopen("test.csv", "r")) !== false) {
    while (($data = fgetcsv($open, 100000, ",")) !== false) {
        $array[] = $data;
    }
 
    fclose($open);
}
$final = array();
$i=0;
foreach ($array as $item){
	if($item[7]=="Draft"){
			foreach ($array as $item_inside){
				if(($item_inside[4]==$item[4]) && ($item_inside[7]!="Draft")) $i++; //taisa i++, kad nav tikai drafts
				}
			if($i==0)array_push($final, $item[4]); //bija tikai drafti, var likt masiivaa
			$i=0;
		}
	}
$final_unique= array_unique($final);
//print_r($final_unique);

foreach($final_unique as $single){
	echo basename($single)." ";
	}
?>

Le fichier test.csv contenant la requête doit être placé dans le même répertoire que le script.
Si vous avez des problèmes, demandez-moi !

2 « J'aime »