diff --git a/.gitattributes b/.gitattributes index 49c278a3aa7385e132af05dc6439e3599e81c32b..ef6d18037836a3fb4f91832fcbec2a8ba7551911 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,6 +6,7 @@ action/copier_local.php -text action/dissocier_document.php -text action/editer_document.php -text action/supprimer_document.php -text +action/supprimer_tous_orphelins.php -text action/tourner.php -text action/verifier_documents_brises.php -text base/medias.php -text diff --git a/action/dissocier_document.php b/action/dissocier_document.php index 0af4bf80c072d6dccbc955513f517bd992c7b07a..7f6169c4686317be9de556faf1833a26dd9826d6 100644 --- a/action/dissocier_document.php +++ b/action/dissocier_document.php @@ -63,6 +63,7 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa sql_delete("spip_documents_liens", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_document=".$id_document); // Si c'est une vignette, l'eliminer du document auquel elle appartient + // cas tordu peu probable sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document); pipeline('post_edition', @@ -91,7 +92,8 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa // On supprime ensuite s'il est orphelin // et si demande - if ($supprime AND !sql_countsel('spip_documents_liens', 'id_document='.$id_document)){ + // ici on ne bloque pas la suppression d'un document rattache a un autre + if ($supprime AND !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".$id_document)){ $supprimer_document = charger_fonction('supprimer_document','action'); return $supprimer_document($id_document); } diff --git a/action/editer_document.php b/action/editer_document.php index ee834cd36a7a2a0b06af358247ebb2c07899049d..eef646f81343dae257096a769b9e0c8b173462fa 100644 --- a/action/editer_document.php +++ b/action/editer_document.php @@ -159,7 +159,7 @@ function instituer_document($id_document,$champs=array()){ $statut = 'prepa'; $trouver_table = charger_fonction('trouver_table','base'); - $res = sql_select('id_objet,objet','spip_documents_liens','id_document='.intval($id_document)); + $res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document)); // dans 10 ans, ca nous fera un bug a corriger vers 2018 // penser a ouvrir un ticket d'ici la :p $date_publication=time()+10*365*24*3600; diff --git a/action/supprimer_document.php b/action/supprimer_document.php index eb98e45950ef6a509227c2a5b68a8cdc45f1c269..7dd0045aeff481114f2a28de060a4cc128bb85aa 100644 --- a/action/supprimer_document.php +++ b/action/supprimer_document.php @@ -43,8 +43,15 @@ function action_supprimer_document_dist($id_document=0) { action_supprimer_document_dist($doc['id_vignette']); sql_delete('spip_documents_liens', 'id_document='.$doc['id_vignette']); } + // Si c'est un document ayant des documents annexes (sous-titre, ...) + // les supprimer aussi + $annexes = array_map('reset',sql_allfetsel("id_document","spip_documents_liens","objet='document' AND id_objet=".intval($id_document))); + foreach($annexes as $id){ + action_supprimer_document_dist($id); + } // dereferencer dans la base + sql_delete('spip_documents_liens', 'id_document='.intval($id_document)); sql_delete('spip_documents', 'id_document='.intval($id_document)); // securite sql_delete('spip_documents_liens', 'id_document='.intval($id_document)); diff --git a/action/supprimer_tous_orphelins.php b/action/supprimer_tous_orphelins.php new file mode 100644 index 0000000000000000000000000000000000000000..6920654a9fc4e41c1e4a8295b8d207abd4874bae --- /dev/null +++ b/action/supprimer_tous_orphelins.php @@ -0,0 +1,56 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2011 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +include_spip('base/abstract_sql'); + +function action_supprimer_tous_orphelins() { + + $securiser_action = charger_fonction('securiser_action','inc'); + $arg = $securiser_action(); + + //on recupere le contexte pour ne supprimer les orphelins que de ce dernier + list($media,$distant,$statut,$sanstitre) = explode('/',$arg); + + //critere sur le media + if($media) { + $select = sql_get_select("extension","spip_types_documents as nnnn","media=".sql_quote($media)); + $where[] = "spip_documents.extension IN ($select)"; + } + + //critere sur le distant + if($distant) + $where[] = "distant=".sql_quote($distant); + + //critere sur le statut + if($statut) + $where[] = "statut REGEXP ".sql_quote("($statut)"); + + //critere sur le sanstitre + if($sanstitre) + $where[] = "titre=''"; + + //on isole les orphelins + $select = sql_get_select("DISTINCT id_document","spip_documents_liens as oooo"); + $cond = "spip_documents.id_document NOT IN ($select)"; + $where[] = $cond; + + $ids_doc_orphelins = sql_select( "id_document", "spip_documents", $where ); + + $supprimer_document = charger_fonction('supprimer_document','action'); + while ($row = sql_fetch($ids_doc_orphelins)) { + $supprimer_document($row['id_document']); // pour les orphelins du contexte, on traite avec la fonction existante + } +} + +?> \ No newline at end of file diff --git a/medias_autoriser.php b/medias_autoriser.php index 30c7a4167365e30038f1f5c513e8d37670cc88c1..61c36d452b1d8c7c360c8ad0b443047354ad5f6a 100644 --- a/medias_autoriser.php +++ b/medias_autoriser.php @@ -39,10 +39,10 @@ function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) { return false; if (!autoriser('modifier','document',$id,$qui,$options)) return false; - + if (!isset($options['document']) OR !$document = $options['document']) $document = sql_fetsel('*','spip_documents','id_document='.intval($id_document)); - + // (on ne le propose pas pour les images qu'on sait // lire : gif jpg png), sauf bug, ou document distant if (in_array($document['extension'], array('gif','jpg','png')) @@ -50,7 +50,7 @@ function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) { AND $document['largeur'] AND $document['distant']!='oui') return false; - + // Donnees sur le type de document $extension = $document['extension']; $type_inclus = sql_getfetsel('inclus','spip_types_documents', "extension=".sql_quote($extension)); @@ -145,13 +145,21 @@ function autoriser_document_supprimer($faire, $type, $id, $qui, $opt){ OR !$qui['id_auteur'] OR !autoriser('ecrire','','',$qui)) return false; + + // ne pas considerer les document parent + // (cas des vignettes ou autre document annexe rattache a un document) + if (sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".intval($id))) + return false; + // si c'est une vignette, se ramener a l'autorisation de son parent if (sql_getfetsel('mode','spip_documents','id_document='.intval($id))=='vignette'){ $id_document = sql_getfetsel('id_document','spip_documents','id_vignette='.intval($id)); - return !$id_document OR autoriser('modifier','document',$id_document); + return !$id_document OR autoriser('modifier','document',$id_document); + } + // si c'est un document annexe, se ramener a l'autorisation de son parent + if ($id_document=sql_getfetsel('id_objet','spip_documents_liens',"objet='document' AND id_document=".intval($id))){ + return autoriser('modifier','document',$id_document); } - if (sql_countsel('spip_documents_liens', 'id_document='.intval($id))) - return false; return autoriser('modifier','document',$id,$qui,$opt); } @@ -203,7 +211,7 @@ function autoriser_autoassocierdocument_dist($faire, $type, $id, $qui, $opts) { /** * Autoriser a nettoyer les orphelins de la base des documents * reserve aux admins complets - * + * * @param $faire * @param $type * @param $id