Perm.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Models\Group;
  10. use ForkBB\Models\Action;
  11. use ForkBB\Models\Forum\Forum;
  12. use ForkBB\Models\Group\Group;
  13. use PDO;
  14. use RuntimeException;
  15. class Perm extends Action
  16. {
  17. /**
  18. * @var array
  19. */
  20. protected $fields;
  21. /**
  22. * Получение таблицы разрешений для раздела
  23. */
  24. public function get(Forum $forum): array
  25. {
  26. $vars = [
  27. ':fid' => $forum->id > 0 ? $forum->id : 0,
  28. ':adm' => FORK_GROUP_ADMIN,
  29. ];
  30. $query = 'SELECT g.g_id, fp.read_forum, fp.post_replies, fp.post_topics
  31. FROM ::groups AS g
  32. LEFT JOIN ::forum_perms AS fp ON (g.g_id=fp.group_id AND fp.forum_id=?i:fid)
  33. WHERE g.g_id!=?i:adm
  34. ORDER BY g.g_id';
  35. $perms = $this->c->DB->query($query, $vars)->fetchAll(PDO::FETCH_UNIQUE);
  36. $result = [];
  37. foreach ($perms as $gid => $perm) {
  38. $group = $this->c->groups->get($gid);
  39. # $forums = $this->c->ForumManager->init($group);
  40. # $group->g_read_forum = (int) ($forums->get($forum->id) instanceof Forum);
  41. $group->g_read_forum = $group->g_read_board;
  42. foreach ($perm as $field => $value) {
  43. $group->{'fp_' . $field} = $value;
  44. $group->{'set_' . $field} = (1 === $group->{'g_' . $field} && 0 !== $value) || 1 === $value;
  45. $group->{'def_' . $field} = 1 === $group->{'g_' . $field};
  46. $group->{'dis_' . $field} = 0 === $group->g_read_board || ('read_forum' !== $field && $forum->redirect_url);
  47. }
  48. $result[$gid] = $group;
  49. }
  50. $this->fields = \array_keys($perm);
  51. return $result;
  52. }
  53. /**
  54. * Обновление разрешений для раздела
  55. */
  56. public function update(Forum $forum, array $perms): void
  57. {
  58. if ($forum->id < 1) {
  59. throw new RuntimeException('The forum does not have ID');
  60. }
  61. foreach ($this->get($forum) as $id => $group) {
  62. if (0 === $group->g_read_board) {
  63. continue;
  64. }
  65. $row = [];
  66. $modDef = false;
  67. $modPerm = false;
  68. foreach ($this->fields as $field) {
  69. if ($group->{'dis_' . $field}) {
  70. $row[$field] = $group->{'set_' . $field} ? 1 : 0;
  71. $modDef = $row[$field] !== $group->{'g_' . $field} ? true : $modDef;
  72. } else {
  73. $row[$field] = empty($perms[$id][$field]) ? 0 : 1;
  74. $modDef = $row[$field] !== $group->{'g_' . $field} ? true : $modDef;
  75. $modPerm = $row[$field] !== (int) $group->{'set_' . $field} ? true : $modPerm;
  76. }
  77. }
  78. if (
  79. $modDef
  80. || $modPerm
  81. ) {
  82. $vars = [
  83. ':gid' => $id,
  84. ':fid' => $forum->id,
  85. ];
  86. $query = 'DELETE
  87. FROM ::forum_perms
  88. WHERE group_id=?i:gid AND forum_id=?i:fid';
  89. $this->c->DB->exec($query, $vars);
  90. }
  91. if ($modDef) {
  92. $vars = \array_values($row);
  93. $vars[] = $id;
  94. $vars[] = $forum->id;
  95. $list = \array_keys($row);
  96. $list[] = 'group_id';
  97. $list[] = 'forum_id';
  98. $list2 = \array_fill(0, \count($list), '?i');
  99. $list = \implode(', ', $list);
  100. $list2 = \implode(', ', $list2);
  101. $query = "INSERT INTO ::forum_perms ({$list})
  102. VALUES ({$list2})";
  103. $this->c->DB->exec($query, $vars);
  104. }
  105. }
  106. }
  107. /**
  108. * Сброс разрешений для раздела
  109. */
  110. public function reset(Forum $forum): void
  111. {
  112. if ($forum->id < 1) {
  113. throw new RuntimeException('The forum does not have ID');
  114. }
  115. $vars = [
  116. ':fid' => $forum->id,
  117. ];
  118. $query = 'DELETE
  119. FROM ::forum_perms
  120. WHERE forum_id=?i:fid';
  121. $this->c->DB->exec($query, $vars);
  122. }
  123. /**
  124. * Удаление разрешений для группы
  125. */
  126. public function delete(Group $group): void
  127. {
  128. if ($group->g_id < 1) {
  129. throw new RuntimeException('The group does not have ID');
  130. }
  131. $vars = [
  132. ':gid' => $group->g_id,
  133. ];
  134. $query = 'DELETE
  135. FROM ::forum_perms
  136. WHERE group_id=?i:gid';
  137. $this->c->DB->exec($query, $vars);
  138. }
  139. /**
  140. * Копирование разрешений первой группы во вторую
  141. */
  142. public function copy(Group $from, Group $to): void
  143. {
  144. if (
  145. $from->g_id < 1
  146. || $to->g_id < 1
  147. ) {
  148. throw new RuntimeException('The group does not have ID');
  149. }
  150. $this->delete($to);
  151. $vars = [
  152. ':old' => $from->g_id,
  153. ':new' => $to->g_id,
  154. ];
  155. $query = 'INSERT INTO ::forum_perms (group_id, forum_id, read_forum, post_replies, post_topics)
  156. SELECT ?i:new, forum_id, read_forum, post_replies, post_topics
  157. FROM ::forum_perms
  158. WHERE group_id=?i:old';
  159. $this->c->DB->exec($query, $vars);
  160. }
  161. }