PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/sharelib.php

https://gitlab.com/ElvisAns/tiki
PHP | 306 lines | 184 code | 48 blank | 74 comment | 16 complexity | 71dd3521412c3ff439f8437bc5e26a43 MD5 | raw file
  1. <?php
  2. // (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
  3. //
  4. // All Rights Reserved. See copyright.txt for details and a complete list of authors.
  5. // Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
  6. // $Id$
  7. /**
  8. * Tiki_ShareGroup
  9. *
  10. */
  11. class Tiki_ShareGroup
  12. {
  13. public $name;
  14. public $selectedValues;
  15. public $groupPerm;
  16. public $categPerm;
  17. public $objectPerm;
  18. /**
  19. * @param $name
  20. */
  21. public function __construct($name)
  22. {
  23. $this->name = $name;
  24. $this->groupPerm = [];
  25. $this->categPerm = [];
  26. $this->objectPerm = [];
  27. $this->selectedValues = [];
  28. }
  29. /**
  30. * @param $permission
  31. */
  32. public function addGroupPermission($permission)
  33. {
  34. $this->groupPerm[$permission] = 'y';
  35. }
  36. /**
  37. * @param $source
  38. * @param $permission
  39. */
  40. public function addCategoryPermission($source, $permission)
  41. {
  42. if (! array_key_exists($permission, $this->categPerm)) {
  43. $this->categPerm[$permission] = [];
  44. }
  45. $this->categPerm[$permission][] = $source;
  46. }
  47. /**
  48. * @param $permission
  49. */
  50. public function addObjectPermission($permission)
  51. {
  52. $this->objectPerm[$permission] = 'y';
  53. $this->selectedValues[] = $permission;
  54. }
  55. /**
  56. * @param $permission
  57. * @return string
  58. */
  59. public function getSourceCategory($permission)
  60. {
  61. if (array_key_exists($permission, $this->categPerm)) {
  62. return implode(', ', $this->categPerm[$permission]);
  63. }
  64. return '';
  65. }
  66. /**
  67. * @param $permission
  68. * @return string
  69. */
  70. public function getLevel($permission)
  71. {
  72. $ret = 'object';
  73. if (array_key_exists($permission, $this->categPerm)) {
  74. $ret = 'category';
  75. }
  76. if (array_key_exists($permission, $this->groupPerm)) {
  77. $ret = 'group';
  78. }
  79. return $ret;
  80. }
  81. /**
  82. * @param $permission
  83. * @return bool
  84. */
  85. public function isSelected($permission)
  86. {
  87. return in_array($permission, $this->selectedValues);
  88. }
  89. /**
  90. * @return bool
  91. */
  92. public function hasSelection()
  93. {
  94. return count($this->selectedValues) != 0;
  95. }
  96. /**
  97. * @param $permissions
  98. */
  99. public function setObjectPermissions($permissions)
  100. {
  101. // Make sure view is present
  102. if (in_array('tiki_p_edit', $permissions) && ! in_array('tiki_p_view', $permissions)) {
  103. $permissions[] = 'tiki_p_view';
  104. }
  105. // Remove redundant permissions
  106. $permissions = array_diff($permissions, array_keys($this->groupPerm));
  107. $permissions = array_diff($permissions, array_keys($this->categPerm));
  108. $this->objectPerm = [];
  109. foreach ($permissions as $p) {
  110. $this->objectPerm[$p] = 'y';
  111. }
  112. $this->selectedValues = $permissions;
  113. }
  114. /**
  115. * @param $name
  116. * @return bool
  117. */
  118. public function hasObjectPermission($name)
  119. {
  120. return isset($this->objectPerm[$name]);
  121. }
  122. }
  123. /**
  124. * Tiki_ShareObject
  125. *
  126. */
  127. class Tiki_ShareObject
  128. {
  129. public $objectHash;
  130. public $objectId;
  131. public $objectType;
  132. public $loadedPermission;
  133. public $validGroups;
  134. /**
  135. * @param $objectType
  136. * @param $objectId
  137. */
  138. public function __construct($objectType, $objectId)
  139. {
  140. global $Tiki_ShareObject__groups;
  141. $this->objectHash = md5($objectType . TikiLib::strtolower($objectId));
  142. $this->objectType = $objectType;
  143. $this->objectId = $objectId;
  144. $this->loadedPermission = [];
  145. $this->validGroups = [];
  146. if ($Tiki_ShareObject__groups == null) {
  147. $this->loadGroups();
  148. }
  149. }
  150. public function loadGroups()
  151. {
  152. global $tikilib;
  153. global $Tiki_ShareObject__groups;
  154. $result = $tikilib->query("SELECT groupName FROM users_groups ORDER BY groupName");
  155. $Tiki_ShareObject__groups = [];
  156. foreach ($result as $row) {
  157. $Tiki_ShareObject__groups[] = $row['groupName'];
  158. }
  159. }
  160. /**
  161. * @param $permissionName
  162. */
  163. public function loadPermission($permissionName)
  164. {
  165. global $tikilib;
  166. $result = $tikilib->query("SELECT groupName FROM users_grouppermissions WHERE permName = ?", [ $permissionName ]);
  167. while ($row = $result->fetchRow()) {
  168. $group = $this->getGroup($row['groupName']);
  169. $group->addGroupPermission($permissionName);
  170. }
  171. $result = $tikilib->query(
  172. "SELECT groupName, tiki_categories.name" .
  173. " FROM" .
  174. " tiki_objects" .
  175. " INNER JOIN tiki_category_objects ON tiki_category_objects.catObjectId = tiki_objects.objectId" .
  176. " INNER JOIN tiki_categories USING(categId)" .
  177. " INNER JOIN users_objectpermissions ON objectType = 'category' AND users_objectpermissions.objectId = MD5( CONCAT('category', categId) )" .
  178. " WHERE" .
  179. " tiki_objects.type = ? AND tiki_objects.itemId = ? AND permName = ?",
  180. [ $this->objectType, $this->objectId, $permissionName ]
  181. );
  182. while ($row = $result->fetchRow()) {
  183. $group = $this->getGroup($row['groupName']);
  184. $group->addCategoryPermission($row['name'], $permissionName);
  185. }
  186. $result = $tikilib->query(
  187. "SELECT groupName FROM users_objectpermissions WHERE permName = ? AND objectType = ? AND objectId = ?",
  188. [ $permissionName, $this->objectType, $this->objectHash ]
  189. );
  190. while ($row = $result->fetchRow()) {
  191. $group = $this->getGroup($row['groupName']);
  192. $group->addObjectPermission($permissionName);
  193. }
  194. }
  195. /**
  196. * @param $name
  197. * @return mixed
  198. */
  199. public function getGroup($name)
  200. {
  201. global $Tiki_ShareObject__groups;
  202. if (! array_key_exists($name, $this->validGroups)) {
  203. if (in_array($name, $Tiki_ShareObject__groups)) {
  204. $this->validGroups[$name] = new Tiki_ShareGroup($name);
  205. } else {
  206. return;
  207. }
  208. }
  209. return $this->validGroups[$name];
  210. }
  211. /**
  212. * @return array
  213. */
  214. public function getValidGroups()
  215. {
  216. ksort($this->validGroups);
  217. return array_values($this->validGroups);
  218. }
  219. /**
  220. * @return array
  221. */
  222. public function getOtherGroups()
  223. {
  224. global $Tiki_ShareObject__groups;
  225. return array_diff($Tiki_ShareObject__groups, array_keys($this->validGroups));
  226. }
  227. /**
  228. * @param $name
  229. * @return bool
  230. */
  231. public function isValid($name)
  232. {
  233. return array_key_exists($name, $this->validGroups);
  234. }
  235. /**
  236. * @param $validPermission
  237. */
  238. public function saveObjectPermissions($validPermission)
  239. {
  240. global $tikilib;
  241. foreach ($validPermission as $permission) {
  242. $tikilib->query(
  243. "DELETE FROM users_objectpermissions WHERE objectType = ? AND objectId = ? AND permName = ?",
  244. [$this->objectType, $this->objectHash, $permission]
  245. );
  246. }
  247. foreach ($this->validGroups as $group) {
  248. foreach ($validPermission as $permission) {
  249. if ($group->hasObjectPermission($permission)) {
  250. $tikilib->query(
  251. "INSERT INTO users_objectpermissions ( groupName, permName, objectType, objectId ) VALUES( ?, ?, ?, ? )",
  252. [$group->name, $permission, $this->objectType, $this->objectHash]
  253. );
  254. }
  255. }
  256. }
  257. }
  258. }