medias_autoriser.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. /* Pour que le pipeline de rale pas ! */
  13. function medias_autoriser(){}
  14. function autoriser_mediatheque_administrer_dist($faire,$quoi,$id,$qui,$options) {
  15. return $qui['statut'] == '0minirezo';
  16. }
  17. function autoriser_documents_menu_dist($faire,$quoi,$id,$qui,$options) {
  18. return autoriser('administrer','mediatheque',$id,$qui,$options);
  19. }
  20. /**
  21. * Autoriser le changement des dimensions sur un document
  22. * @param <type> $faire
  23. * @param <type> $quoi
  24. * @param <type> $id
  25. * @param <type> $qui
  26. * @param <type> $options
  27. * @return <type>
  28. */
  29. function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) {
  30. if (!$id_document=intval($id))
  31. return false;
  32. if (!autoriser('modifier','document',$id,$qui,$options))
  33. return false;
  34. if (!isset($options['document']) OR !$document = $options['document'])
  35. $document = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
  36. // (on ne le propose pas pour les images qu'on sait
  37. // lire : gif jpg png), sauf bug, ou document distant
  38. if (in_array($document['extension'], array('gif','jpg','png'))
  39. AND $document['hauteur']
  40. AND $document['largeur']
  41. AND $document['distant']!='oui')
  42. return false;
  43. // Donnees sur le type de document
  44. $extension = $document['extension'];
  45. $type_inclus = sql_getfetsel('inclus','spip_types_documents', "extension=".sql_quote($extension));
  46. if (($type_inclus == "embed" OR $type_inclus == "image")
  47. AND (
  48. // documents dont la taille est definie
  49. ($document['largeur'] * $document['hauteur'])
  50. // ou distants
  51. OR $document['distant'] == 'oui'
  52. // ou tous les formats qui s'affichent en embed
  53. OR $type_inclus == "embed"
  54. ))
  55. return true;
  56. }
  57. /**
  58. * On ne peut joindre un document qu'a un objet qu'on a le droit d'editer
  59. * mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
  60. * au hack id_objet = 0-id_auteur
  61. * Il faut aussi que les documents aient ete actives sur les objets concernes
  62. * ou que ce soit un article, sur lequel on peut toujours uploader des images
  63. *
  64. * http://code.spip.net/@autoriser_joindredocument_dist
  65. *
  66. * @return bool
  67. */
  68. function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
  69. include_spip('inc/config');
  70. return
  71. (
  72. $type=='article'
  73. OR in_array(table_objet_sql($type),explode(',',lire_config('documents_objets', '')))
  74. )
  75. AND (
  76. (
  77. $id>0
  78. AND autoriser('modifier', $type, $id, $qui, $opt)
  79. )
  80. OR (
  81. $id<0
  82. AND abs($id) == $qui['id_auteur']
  83. AND autoriser('ecrire', $type, $id, $qui, $opt)
  84. )
  85. );
  86. }
  87. /**
  88. * On ne peut modifier un document que s'il n'est pas lie a un objet qu'on n'a pas le droit d'editer
  89. *
  90. * @staticvar <type> $m
  91. * @param <type> $faire
  92. * @param <type> $type
  93. * @param <type> $id
  94. * @param <type> $qui
  95. * @param <type> $opt
  96. * @return <type>
  97. */
  98. function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){
  99. static $m = array();
  100. $q=$qui['id_auteur'];
  101. if (isset($m[$q][$id]))
  102. return $m[$q][$id];
  103. $s = sql_getfetsel("statut", "spip_documents", "id_document=".intval($id));
  104. // les admins ont le droit de modifier tous les documents existants
  105. if ($qui['statut'] == '0minirezo'
  106. AND !$qui['restreint'])
  107. return is_string($s)?true:false;
  108. if (!isset($m[$q][$id])) {
  109. // un document non publie peut etre modifie par tout le monde (... ?)
  110. if ($s AND $s!=='publie' AND ($qui['id_auteur'] > 0))
  111. $m[$q][$id] = true;
  112. }
  113. if (!isset($m[$q][$id])) {
  114. $interdit = false;
  115. $s = sql_select("id_objet,objet", "spip_documents_liens", "id_document=".intval($id));
  116. while ($t = sql_fetch($s)) {
  117. if (!autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) {
  118. $interdit = true;
  119. break;
  120. }
  121. }
  122. $m[$q][$id] = ($interdit?false:true);
  123. }
  124. return $m[$q][$id];
  125. }
  126. /**
  127. * On ne peut supprimer un document que s'il n'est lie a aucun objet
  128. * ET qu'on a le droit de le modifier !
  129. *
  130. * @param <type> $faire
  131. * @param <type> $type
  132. * @param <type> $id
  133. * @param <type> $qui
  134. * @param <type> $opt
  135. * @return <type>
  136. */
  137. function autoriser_document_supprimer_dist($faire, $type, $id, $qui, $opt){
  138. if (!intval($id)
  139. OR !$qui['id_auteur']
  140. OR !autoriser('ecrire','','',$qui))
  141. return false;
  142. // ne pas considerer les document parent
  143. // (cas des vignettes ou autre document annexe rattache a un document)
  144. if (sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".intval($id)))
  145. return false;
  146. // si c'est une vignette, se ramener a l'autorisation de son parent
  147. if (sql_getfetsel('mode','spip_documents','id_document='.intval($id))=='vignette'){
  148. $id_document = sql_getfetsel('id_document','spip_documents','id_vignette='.intval($id));
  149. return !$id_document OR autoriser('modifier','document',$id_document);
  150. }
  151. // si c'est un document annexe, se ramener a l'autorisation de son parent
  152. if ($id_document=sql_getfetsel('id_objet','spip_documents_liens',"objet='document' AND id_document=".intval($id))){
  153. return autoriser('modifier','document',$id_document);
  154. }
  155. return autoriser('modifier','document',$id,$qui,$opt);
  156. }
  157. //
  158. // Peut-on voir un document dans _DIR_IMG ?
  159. // Tout le monde (y compris les visiteurs non enregistres), puisque par
  160. // defaut ce repertoire n'est pas protege ; si une extension comme
  161. // acces_restreint a positionne creer_htaccess, on regarde
  162. // si le document est lie a un element publie
  163. // (TODO: a revoir car c'est dommage de sortir de l'API true/false)
  164. //
  165. // http://code.spip.net/@autoriser_document_voir_dist
  166. function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
  167. if (!isset($GLOBALS['meta']["creer_htaccess"])
  168. OR $GLOBALS['meta']["creer_htaccess"] != 'oui')
  169. return true;
  170. if ((!is_numeric($id)) OR $id < 0) return false;
  171. if (in_array($qui['statut'], array('0minirezo', '1comite')))
  172. return 'htaccess';
  173. if ($liens = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document='.intval($id)))
  174. foreach ($liens as $l) {
  175. $table_sql = table_objet_sql($l['objet']);
  176. $id_table = id_table_objet($l['objet']);
  177. if (sql_countsel($table_sql, "$id_table = ". intval($l['id_objet'])
  178. . (in_array($l['objet'], array('article', 'rubrique', 'breve'))
  179. ? " AND statut = 'publie'"
  180. : '')
  181. ) > 0)
  182. return 'htaccess';
  183. }
  184. return false;
  185. }
  186. /**
  187. * Auto-association de documents a du contenu editorial qui le reference
  188. * par defaut true pour tous les objets
  189. */
  190. function autoriser_autoassocierdocument_dist($faire, $type, $id, $qui, $opts) {
  191. return true;
  192. }
  193. /**
  194. * Autoriser a nettoyer les orphelins de la base des documents
  195. * reserve aux admins complets
  196. *
  197. * @param $faire
  198. * @param $type
  199. * @param $id
  200. * @param $qui
  201. * @param $opt
  202. * @return bool
  203. */
  204. function autoriser_orphelins_supprimer_dist($faire, $type, $id, $qui, $opt){
  205. if ($qui['statut'] == '0minirezo'
  206. AND !$qui['restreint'])
  207. return true;
  208. }
  209. /**
  210. * Autoriser a associer des documents a un objet :
  211. * il faut avoir le droit de modifier cet objet
  212. * @param $faire
  213. * @param $type
  214. * @param $id
  215. * @param $qui
  216. * @param $opt
  217. * @return bool
  218. */
  219. function autoriser_associerdocuments_dist($faire, $type, $id, $qui, $opt){
  220. // cas particulier (hack nouvel objet)
  221. if (intval($id)<0 AND $id==-$qui['id_auteur']){
  222. return true;
  223. }
  224. return autoriser('modifier',$type,$id,$qui,$opt);
  225. }
  226. /**
  227. * Autoriser a dissocier des documents a un objet :
  228. * il faut avoir le droit de modifier cet objet
  229. * @param $faire
  230. * @param $type
  231. * @param $id
  232. * @param $qui
  233. * @param $opt
  234. * @return bool
  235. */
  236. function autoriser_dissocierdocuments_dist($faire, $type, $id, $qui, $opt){
  237. // cas particulier (hack nouvel objet)
  238. if (intval($id)<0 AND $id==-$qui['id_auteur']){
  239. return true;
  240. }
  241. return autoriser('modifier',$type,$id,$qui,$opt);
  242. }