mots_autoriser.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. /**
  12. * Définit les autorisations du plugin mots
  13. *
  14. * @package Mots\Autorisations
  15. **/
  16. if (!defined('_ECRIRE_INC_VERSION')) return;
  17. /** Fonction d'appel pour le pipeline */
  18. function mots_autoriser(){}
  19. /**
  20. * Autorisation de voir un élément de menu
  21. *
  22. * @param string $faire Action demandée
  23. * @param string $type Type d'objet sur lequel appliquer l'action
  24. * @param int $id Identifiant de l'objet
  25. * @param array $qui Description de l'auteur demandant l'autorisation
  26. * @param array $opt Options de cette autorisation
  27. * @return bool true s'il a le droit, false sinon
  28. **/
  29. function autoriser_mots_menu_dist($faire, $type, $id, $qui, $opt){
  30. if ($qui['statut'] == '0minirezo')
  31. return ($GLOBALS['meta']['articles_mots'] != 'non' OR sql_countsel('spip_groupes_mots'));
  32. $where = "";
  33. if ($qui['statut']=='1comite')
  34. $where = "comite='oui' OR forum='oui'";
  35. if ($qui['statut']=='6forum')
  36. $where = "forum='oui'";
  37. return ($where
  38. AND $GLOBALS['meta']['articles_mots'] != 'non'
  39. AND sql_countsel('spip_groupes_mots',$where));
  40. }
  41. /**
  42. * Autorisation de voir le bouton d'accès rapide à la création d'un mot clé
  43. *
  44. * @param string $faire Action demandée
  45. * @param string $type Type d'objet sur lequel appliquer l'action
  46. * @param int $id Identifiant de l'objet
  47. * @param array $qui Description de l'auteur demandant l'autorisation
  48. * @param array $opt Options de cette autorisation
  49. * @return bool true s'il a le droit, false sinon
  50. **/
  51. function autoriser_motcreer_menu_dist($faire, $type, $id, $qui, $opt){
  52. // [fixme] Meta 'article_mots' mal nommée maintenant
  53. // car elle désigne l'activation ou non des mots clés, quelque soit l'objet.
  54. return ($GLOBALS['meta']['articles_mots'] != 'non'
  55. AND sql_countsel('spip_groupes_mots')
  56. AND autoriser('creer','mot',null,$qui,$opt));
  57. }
  58. /**
  59. * Autorisation de voir un groupe de mots
  60. *
  61. * L'autorisation est donnée selon la configuration du groupe
  62. * qui gère cela par type d'auteur (administrateur, rédacteurs, visiteurs)
  63. *
  64. * @param string $faire Action demandée
  65. * @param string $type Type d'objet sur lequel appliquer l'action
  66. * @param int $id Identifiant de l'objet
  67. * @param array $qui Description de l'auteur demandant l'autorisation
  68. * @param array $opt Options de cette autorisation
  69. * @return bool true s'il a le droit, false sinon
  70. **/
  71. function autoriser_groupemots_voir_dist($faire, $type, $id, $qui, $opt) {
  72. if ($qui['statut'] == '0minirezo') return true;
  73. $acces = sql_fetsel("comite,forum", "spip_groupes_mots", "id_groupe=".intval($id));
  74. if ($qui['statut']=='1comite' AND ($acces['comite'] == 'oui' OR $acces['forum'] == 'oui'))
  75. return true;
  76. if ($qui['statut']=='6forum' AND $acces['forum'] == 'oui')
  77. return true;
  78. return false;
  79. }
  80. /**
  81. * Autorisation de créer un groupe de mots
  82. *
  83. * @param string $faire Action demandée
  84. * @param string $type Type d'objet sur lequel appliquer l'action
  85. * @param int $id Identifiant de l'objet
  86. * @param array $qui Description de l'auteur demandant l'autorisation
  87. * @param array $opt Options de cette autorisation
  88. * @return bool true s'il a le droit, false sinon
  89. **/
  90. function autoriser_groupemots_creer_dist($faire, $type, $id, $qui, $opt) {
  91. return
  92. $qui['statut'] == '0minirezo'
  93. AND !$qui['restreint'];
  94. }
  95. /**
  96. * Autorisation de modifier un groupe de mots
  97. *
  98. * Cela inclut également l'ajout ou modification des mots lui appartenant
  99. *
  100. * @param string $faire Action demandée
  101. * @param string $type Type d'objet sur lequel appliquer l'action
  102. * @param int $id Identifiant de l'objet
  103. * @param array $qui Description de l'auteur demandant l'autorisation
  104. * @param array $opt Options de cette autorisation
  105. * @return bool true s'il a le droit, false sinon
  106. **/
  107. function autoriser_groupemots_modifier_dist($faire, $type, $id, $qui, $opt) {
  108. return
  109. $qui['statut'] == '0minirezo' AND !$qui['restreint']
  110. AND autoriser('voir','groupemots',$id,$qui,$opt);
  111. }
  112. /**
  113. * Autorisation de supprimer un groupe de mots
  114. *
  115. * @param string $faire Action demandée
  116. * @param string $type Type d'objet sur lequel appliquer l'action
  117. * @param int $id Identifiant de l'objet
  118. * @param array $qui Description de l'auteur demandant l'autorisation
  119. * @param array $opt Options de cette autorisation
  120. * @return bool true s'il a le droit, false sinon
  121. **/
  122. function autoriser_groupemots_supprimer_dist($faire, $type, $id, $qui, $opt) {
  123. if (!autoriser('modifier','groupemots',$id))
  124. return false;
  125. return sql_countsel('spip_mots','id_groupe='.intval($id))?false:true;
  126. }
  127. /**
  128. * Autorisation de modifier un mot
  129. *
  130. * Il faut avoir le droit de modifier le groupe parent
  131. *
  132. * Note : passer l'id_groupe dans le tableau d'option
  133. * permet de gagner du CPU et une requête SQL (c'est ce que fait l'espace privé)
  134. *
  135. * @param string $faire Action demandée
  136. * @param string $type Type d'objet sur lequel appliquer l'action
  137. * @param int $id Identifiant de l'objet
  138. * @param array $qui Description de l'auteur demandant l'autorisation
  139. * @param array $opt Options de cette autorisation
  140. * @return bool true s'il a le droit, false sinon
  141. **/
  142. function autoriser_mot_modifier_dist($faire, $type, $id, $qui, $opt) {
  143. return
  144. isset($opt['id_groupe'])
  145. ? autoriser('modifier', 'groupemots', $opt['id_groupe'], $qui, $opt)
  146. : (
  147. $t = sql_getfetsel("id_groupe", "spip_mots", "id_mot=".intval($id))
  148. AND autoriser('modifier', 'groupemots', $t, $qui, $opt)
  149. );
  150. }
  151. /**
  152. * Autorisation de créer un mot
  153. *
  154. * Vérifie si une association est demandée en option, qu'elle est possible dans un des groupes,
  155. * c'est à dire qu'une liaison est possible entre un groupe et l'objet lié
  156. *
  157. * Si l'id_groupe est passé en option,
  158. * vérifie également que l'auteur a le droit de modifier ce groupe
  159. *
  160. * @param string $faire Action demandée
  161. * @param string $type Type d'objet sur lequel appliquer l'action
  162. * @param int $id Identifiant de l'objet
  163. * @param array $qui Description de l'auteur demandant l'autorisation
  164. * @param array $opt Options de cette autorisation
  165. * @return bool true s'il a le droit, false sinon
  166. **/
  167. function autoriser_mot_creer_dist($faire, $type, $id, $qui, $opt) {
  168. if ($qui['statut'] != '0minirezo' OR $qui['restreint'])
  169. return false;
  170. $where = '';
  171. // si objet associe, verifier qu'un groupe peut etre associe
  172. // a la table correspondante
  173. if (isset($opt['associer_objet'])
  174. AND $associer_objet = $opt['associer_objet']){
  175. if (!preg_match(',^(\w+)\|[0-9]+$,',$associer_objet,$match))
  176. return false;
  177. $where = "tables_liees REGEXP '(^|,)".addslashes(table_objet($match[1]))."($|,)'";
  178. }
  179. // si pas de groupe de mot qui colle, pas le droit
  180. if (!sql_countsel('spip_groupes_mots',$where))
  181. return false;
  182. if (isset($opt['id_groupe']))
  183. return autoriser('modifier','groupemots',$opt['id_groupe']);
  184. return true;
  185. }
  186. /**
  187. * Autorisation de supprimer un mot
  188. *
  189. * Par défaut : pouvoir créer un mot dans le groupe
  190. *
  191. * @param string $faire Action demandée
  192. * @param string $type Type d'objet sur lequel appliquer l'action
  193. * @param int $id Identifiant de l'objet
  194. * @param array $qui Description de l'auteur demandant l'autorisation
  195. * @param array $opt Options de cette autorisation
  196. * @return bool true s'il a le droit, false sinon
  197. **/
  198. function autoriser_mot_supprimer_dist($faire, $type, $id, $qui, $opt) {
  199. // On cherche le groupe du mot
  200. $id_groupe = $opt['id_groupe'] ? $opt['id_groupe'] : sql_getfetsel('id_groupe', 'spip_mots', 'id_mot = '.intval($id));
  201. return autoriser('creer', 'mot', $id, $qui, array('id_groupe'=>$id_groupe));
  202. }
  203. /**
  204. * Autorisation d'associer des mots à un objet
  205. *
  206. * Si groupe_champ ou id_groupe est fourni dans le tableau d'options,
  207. * on regarde les droits pour ce groupe en particulier
  208. *
  209. * On interdit aussi d'associer des mots à d'autres mots ou groupes de mots
  210. *
  211. * @param string $faire Action demandée
  212. * @param string $type Type d'objet sur lequel appliquer l'action
  213. * @param int $id Identifiant de l'objet
  214. * @param array $qui Description de l'auteur demandant l'autorisation
  215. * @param array $opt Options de cette autorisation
  216. * @return bool true s'il a le droit, false sinon
  217. */
  218. function autoriser_associermots_dist($faire,$type,$id,$qui,$opt){
  219. // jamais de mots sur des mots
  220. if ($type=='mot') return false;
  221. if ($type=='groupemots') return false;
  222. $droit = substr($qui['statut'],1);
  223. if (!isset($opt['groupe_champs']) AND !isset($opt['id_groupe'])){
  224. // chercher si un groupe est autorise pour mon statut
  225. // et pour la table demandee
  226. $table = addslashes(table_objet($type));
  227. if (sql_countsel('spip_groupes_mots',"tables_liees REGEXP '(^|,)$table($|,)' AND ".addslashes($droit)."='oui'"))
  228. return true;
  229. }
  230. // cas d'un groupe en particulier
  231. else {
  232. // on recupere les champs du groupe s'ils ne sont pas passes en opt
  233. if (!isset($opt['groupe_champs'])){
  234. if (!$id_groupe = $opt['id_groupe'])
  235. return false;
  236. include_spip('base/abstract_sql');
  237. $opt['groupe_champs'] = sql_fetsel("*", "spip_groupes_mots", "id_groupe=".intval($id_groupe));
  238. }
  239. $droit = $opt['groupe_champs'][$droit];
  240. return
  241. ($droit == 'oui')
  242. AND
  243. // on verifie que l'objet demande est bien dans les tables liees
  244. in_array(
  245. table_objet($type),
  246. explode(',', $opt['groupe_champs']['tables_liees'])
  247. );
  248. }
  249. return false;
  250. }
  251. /**
  252. * Autorisation d'affichier le sélecteur de mots
  253. *
  254. * Vérifie le droit d'afficher le selecteur de mots
  255. * pour un groupe de mot donné, dans un objet / id_objet donné
  256. *
  257. * C'est fonction de la configuration du groupe de mots.
  258. *
  259. * @param string $faire Action demandée
  260. * @param string $type Type d'objet sur lequel appliquer l'action
  261. * @param int $id Identifiant de l'objet
  262. * @param array $qui Description de l'auteur demandant l'autorisation
  263. * @param array $opt Options de cette autorisation
  264. * @return bool true s'il a le droit, false sinon
  265. */
  266. function autoriser_groupemots_afficherselecteurmots_dist($faire,$type,$id,$qui,$opt){
  267. if (!isset($opt['minirezo']) || !isset($opt['comite'])) {
  268. $i = sql_fetsel(
  269. array('minirezo', 'comite'),
  270. 'spip_groupes_mots',
  271. 'id_groupe=' . intval($id));
  272. if (!$i) return false; # le groupe n'existe pas
  273. $admin = $i['minirezo'];
  274. $redac = $i['comite'];
  275. } else {
  276. $admin = $opt['minirezo'];
  277. $redac = $opt['comite'];
  278. }
  279. $statuts = array();
  280. if ($admin == 'oui') $statuts[] = '0minirezo';
  281. if ($redac == 'oui') $statuts[] = '1comite';
  282. return in_array($qui['statut'], $statuts);
  283. }
  284. /**
  285. * Autorisation d'affichier le formulaire de logo
  286. *
  287. * @param string $faire Action demandée
  288. * @param string $type Type d'objet sur lequel appliquer l'action
  289. * @param int $id Identifiant de l'objet
  290. * @param array $qui Description de l'auteur demandant l'autorisation
  291. * @param array $opt Options de cette autorisation
  292. * @return bool true s'il a le droit, false sinon
  293. */
  294. function autoriser_mot_iconifier_dist($faire,$type,$id,$qui,$opt){
  295. return (($qui['statut'] == '0minirezo') AND !$qui['restreint']);
  296. }
  297. /**
  298. * Autorisation d'affichier le formulaire de logo
  299. *
  300. * @param string $faire Action demandée
  301. * @param string $type Type d'objet sur lequel appliquer l'action
  302. * @param int $id Identifiant de l'objet
  303. * @param array $qui Description de l'auteur demandant l'autorisation
  304. * @param array $opt Options de cette autorisation
  305. * @return bool true s'il a le droit, false sinon
  306. */
  307. function autoriser_groupemots_iconifier_dist($faire,$type,$id,$qui,$opt){
  308. return (($qui['statut'] == '0minirezo') AND !$qui['restreint']);
  309. }
  310. ?>