/upload/includes/functions_group.php

http://torrentpier2.googlecode.com/ · PHP · 230 lines · 195 code · 33 blank · 2 comment · 9 complexity · dfb8dc0101f20b99c5e12486b8668a11 MD5 · raw file

  1. <?php
  2. if (!defined('BB_ROOT')) die(basename(__FILE__));
  3. function update_user_level ($user_id)
  4. {
  5. global $datastore;
  6. if (is_array($user_id))
  7. {
  8. $user_id = join(',', $user_id);
  9. }
  10. $user_groups_in = ($user_id !== 'all') ? "AND ug.user_id IN($user_id)" : '';
  11. $users_in = ($user_id !== 'all') ? "AND u.user_id IN($user_id)" : '';
  12. $tmp_table = 'tmp_levels';
  13. DB()->query("
  14. CREATE TEMPORARY TABLE $tmp_table (
  15. user_id MEDIUMINT NOT NULL DEFAULT '0',
  16. user_level TINYINT NOT NULL DEFAULT '0',
  17. PRIMARY KEY (user_id)
  18. ) ENGINE = MEMORY
  19. ");
  20. DB()->query("
  21. REPLACE INTO $tmp_table (user_id, user_level)
  22. SELECT u.user_id, ". USER ."
  23. FROM ". BB_USERS ." u
  24. WHERE user_level NOT IN(". USER .",". ADMIN .")
  25. $users_in
  26. UNION
  27. SELECT DISTINCT ug.user_id, ". GROUP_MEMBER ."
  28. FROM ". BB_GROUPS ." g, ". BB_USER_GROUP ." ug
  29. WHERE g.group_single_user = 0
  30. AND ug.group_id = g.group_id
  31. AND ug.user_pending = 0
  32. $user_groups_in
  33. UNION
  34. SELECT DISTINCT ug.user_id, ". MOD ."
  35. FROM ". BB_AUTH_ACCESS ." aa, ". BB_USER_GROUP ." ug
  36. WHERE aa.forum_perm & ". BF_AUTH_MOD ."
  37. AND ug.group_id = aa.group_id
  38. AND ug.user_pending = 0
  39. $user_groups_in
  40. ");
  41. DB()->query("
  42. UPDATE ". BB_USERS ." u, $tmp_table lev SET
  43. u.user_level = lev.user_level
  44. WHERE lev.user_id = u.user_id
  45. AND u.user_level NOT IN(". ADMIN .")
  46. $users_in
  47. ");
  48. DB()->query("DROP TEMPORARY TABLE $tmp_table");
  49. update_user_permissions($user_id);
  50. delete_orphan_usergroups();
  51. $datastore->update('moderators');
  52. }
  53. function delete_group ($group_id)
  54. {
  55. $group_id = (int) $group_id;
  56. DB()->query("
  57. DELETE ug, g, aa
  58. FROM ". BB_USER_GROUP ." ug
  59. LEFT JOIN ". BB_GROUPS ." g ON(g.group_id = $group_id)
  60. LEFT JOIN ". BB_AUTH_ACCESS ." aa ON(aa.group_id = $group_id)
  61. WHERE ug.group_id = $group_id
  62. ");
  63. update_user_level('all');
  64. }
  65. function add_user_into_group ($group_id, $user_id, $user_pending = 0, $user_time = TIMENOW)
  66. {
  67. $args = DB()->build_array('INSERT', array(
  68. 'group_id' => (int) $group_id,
  69. 'user_id' => (int) $user_id,
  70. 'user_pending' => (int) $user_pending,
  71. 'user_time' => (int) $user_time,
  72. ));
  73. DB()->query("REPLACE INTO ". BB_USER_GROUP . $args);
  74. if (!$user_pending)
  75. {
  76. update_user_level($user_id);
  77. }
  78. }
  79. function delete_user_group ($group_id, $user_id)
  80. {
  81. DB()->query("
  82. DELETE FROM ". BB_USER_GROUP ."
  83. WHERE user_id = ". (int) $user_id ."
  84. AND group_id = ". (int) $group_id ."
  85. ");
  86. update_user_level($user_id);
  87. }
  88. function create_user_group ($user_id)
  89. {
  90. DB()->query("INSERT INTO ". BB_GROUPS ." (group_single_user) VALUES (1)");
  91. $group_id = (int) DB()->sql_nextid();
  92. $user_id = (int) $user_id;
  93. DB()->query("INSERT INTO ". BB_USER_GROUP ." (user_id, group_id, user_time) VALUES ($user_id, $group_id, ". TIMENOW .")");
  94. return $group_id;
  95. }
  96. function get_group_data ($group_id)
  97. {
  98. if ($group_id === 'all')
  99. {
  100. $sql = "SELECT g.*, u.username AS moderator_name, aa.group_id AS auth_mod
  101. FROM ". BB_GROUPS ." g
  102. LEFT JOIN ". BB_USERS ." u ON(g.group_moderator = u.user_id)
  103. LEFT JOIN ". BB_AUTH_ACCESS ." aa ON(aa.group_id = g.group_id AND aa.forum_perm & ". BF_AUTH_MOD .")
  104. WHERE g.group_single_user = 0
  105. GROUP BY g.group_id
  106. ORDER BY g.group_name";
  107. }
  108. else
  109. {
  110. $sql = "SELECT g.*, u.username AS moderator_name, aa.group_id AS auth_mod
  111. FROM ". BB_GROUPS ." g
  112. LEFT JOIN ". BB_USERS ." u ON(g.group_moderator = u.user_id)
  113. LEFT JOIN ". BB_AUTH_ACCESS ." aa ON(aa.group_id = g.group_id AND aa.forum_perm & ". BF_AUTH_MOD .")
  114. WHERE g.group_id = ". (int) $group_id ."
  115. AND g.group_single_user = 0
  116. LIMIT 1";
  117. }
  118. $method = ($group_id === 'all') ? 'fetch_rowset' : 'fetch_row';
  119. return DB()->$method($sql);
  120. }
  121. function delete_permissions ($group_id = null, $user_id = null, $cat_id = null)
  122. {
  123. $group_id = get_id_csv($group_id);
  124. $user_id = get_id_csv($user_id);
  125. $cat_id = get_id_csv($cat_id);
  126. $forums_join_sql = ($cat_id) ? "
  127. INNER JOIN ". BB_FORUMS ." f ON(a.forum_id = f.forum_id AND f.cat_id IN($cat_id))
  128. " : '';
  129. if ($group_id)
  130. {
  131. DB()->query("DELETE a FROM ". BB_AUTH_ACCESS ." a $forums_join_sql WHERE a.group_id IN($group_id)");
  132. }
  133. if ($user_id)
  134. {
  135. DB()->query("DELETE a FROM ". BB_AUTH_ACCESS_SNAP ." a $forums_join_sql WHERE a.user_id IN($user_id)");
  136. }
  137. }
  138. function store_permissions ($group_id, $auth_ary)
  139. {
  140. if (empty($auth_ary) || !is_array($auth_ary)) return;
  141. $values = array();
  142. foreach ($auth_ary as $forum_id => $permission)
  143. {
  144. $values[] = array(
  145. 'group_id' => (int) $group_id,
  146. 'forum_id' => (int) $forum_id,
  147. 'forum_perm' => (int) $permission,
  148. );
  149. }
  150. $values = DB()->build_array('MULTI_INSERT', $values);
  151. DB()->query("INSERT INTO ". BB_AUTH_ACCESS . $values);
  152. }
  153. function update_user_permissions ($user_id = 'all')
  154. {
  155. if (is_array($user_id))
  156. {
  157. $user_id = join(',', $user_id);
  158. }
  159. $delete_in = ($user_id !== 'all') ? " WHERE user_id IN($user_id)" : '';
  160. $users_in = ($user_id !== 'all') ? "AND ug.user_id IN($user_id)" : '';
  161. DB()->query("DELETE FROM ". BB_AUTH_ACCESS_SNAP . $delete_in);
  162. DB()->query("
  163. INSERT INTO ". BB_AUTH_ACCESS_SNAP ."
  164. (user_id, forum_id, forum_perm)
  165. SELECT
  166. ug.user_id, aa.forum_id, BIT_OR(aa.forum_perm)
  167. FROM
  168. ". BB_USER_GROUP ." ug,
  169. ". BB_GROUPS ." g,
  170. ". BB_AUTH_ACCESS ." aa
  171. WHERE
  172. ug.user_pending = 0
  173. $users_in
  174. AND g.group_id = ug.group_id
  175. AND aa.group_id = g.group_id
  176. GROUP BY
  177. ug.user_id, aa.forum_id
  178. ");
  179. }
  180. function delete_orphan_usergroups ()
  181. {
  182. // GROUP_SINGLE_USER without AUTH_ACCESS
  183. DB()->query("
  184. DELETE g
  185. FROM ". BB_GROUPS ." g
  186. LEFT JOIN ". BB_AUTH_ACCESS ." aa USING(group_id)
  187. WHERE g.group_single_user = 1
  188. AND aa.group_id IS NULL
  189. ");
  190. // orphan USER_GROUP (against GROUP table)
  191. DB()->query("
  192. DELETE ug
  193. FROM ". BB_USER_GROUP ." ug
  194. LEFT JOIN ". BB_GROUPS ." g USING(group_id)
  195. WHERE g.group_id IS NULL
  196. ");
  197. }