%PDF- %PDF-
Direktori : /data/www_bck/varak.cloud_bck/tracker.varak.cloud/src/Legacy/ |
Current File : //data/www_bck/varak.cloud_bck/tracker.varak.cloud/src/Legacy/Group.php |
<?php /** * TorrentPier – Bull-powered BitTorrent tracker engine * * @copyright Copyright (c) 2005-2018 TorrentPier (https://torrentpier.com) * @link https://github.com/torrentpier/torrentpier for the canonical source repository * @license https://github.com/torrentpier/torrentpier/blob/master/LICENSE MIT License */ namespace TorrentPier\Legacy; /** * Class Group * @package TorrentPier\Legacy */ class Group { /** * Update user access level * * @param array|int $user_id */ public static function update_user_level($user_id) { global $datastore; if (\is_array($user_id)) { $user_id = implode(',', $user_id); } $user_groups_in = ($user_id !== 'all') ? "AND ug.user_id IN($user_id)" : ''; $users_in = ($user_id !== 'all') ? "AND u.user_id IN($user_id)" : ''; $tmp_table = 'tmp_levels'; DB()->query(" CREATE TEMPORARY TABLE $tmp_table ( user_id MEDIUMINT NOT NULL DEFAULT '0', user_level TINYINT NOT NULL DEFAULT '0', PRIMARY KEY (user_id) ) ENGINE = MEMORY "); DB()->query(" REPLACE INTO $tmp_table (user_id, user_level) SELECT u.user_id, " . USER . " FROM " . BB_USERS . " u WHERE user_level NOT IN(" . USER . "," . ADMIN . ") $users_in UNION SELECT DISTINCT ug.user_id, " . GROUP_MEMBER . " FROM " . BB_GROUPS . " g, " . BB_USER_GROUP . " ug WHERE g.group_single_user = 0 AND ug.group_id = g.group_id AND ug.user_pending = 0 $user_groups_in UNION SELECT DISTINCT ug.user_id, " . MOD . " FROM " . BB_AUTH_ACCESS . " aa, " . BB_USER_GROUP . " ug WHERE aa.forum_perm & " . BF_AUTH_MOD . " AND ug.group_id = aa.group_id AND ug.user_pending = 0 $user_groups_in "); DB()->query(" UPDATE " . BB_USERS . " u, $tmp_table lev SET u.user_level = lev.user_level WHERE lev.user_id = u.user_id AND u.user_level NOT IN(" . ADMIN . ") $users_in "); DB()->query("DROP TEMPORARY TABLE $tmp_table"); self::update_user_permissions($user_id); self::delete_orphan_usergroups(); $datastore->update('moderators'); } /** * Delete group * * @param int $group_id */ public static function delete_group($group_id) { $group_id = (int)$group_id; DB()->query(" DELETE ug, g, aa FROM " . BB_USER_GROUP . " ug LEFT JOIN " . BB_GROUPS . " g ON(g.group_id = $group_id) LEFT JOIN " . BB_AUTH_ACCESS . " aa ON(aa.group_id = $group_id) WHERE ug.group_id = $group_id "); DB()->query("UPDATE " . BB_POSTS . " SET attach_rg_sig = 0, poster_rg_id = 0 WHERE poster_rg_id = " . $group_id); self::update_user_level('all'); } /** * Add user to the group * * @param int $group_id * @param int $user_id * @param int $user_pending * @param int $user_time */ public static function add_user_into_group($group_id, $user_id, $user_pending = 0, $user_time = TIMENOW) { $args = DB()->build_array('INSERT', array( 'group_id' => (int)$group_id, 'user_id' => (int)$user_id, 'user_pending' => (int)$user_pending, 'user_time' => (int)$user_time, )); DB()->query("REPLACE INTO " . BB_USER_GROUP . $args); if (!$user_pending) { self::update_user_level($user_id); } } /** * Delete user from the group * * @param int $group_id * @param int $user_id */ public static function delete_user_group($group_id, $user_id) { DB()->query(" DELETE FROM " . BB_USER_GROUP . " WHERE user_id = " . (int)$user_id . " AND group_id = " . (int)$group_id . " "); self::update_user_level($user_id); } /** * Create user in the group * * @param int $user_id * @return int */ public static function create_user_group($user_id) { DB()->query("INSERT INTO " . BB_GROUPS . " (group_single_user) VALUES (1)"); $group_id = (int)DB()->sql_nextid(); $user_id = (int)$user_id; DB()->query("INSERT INTO " . BB_USER_GROUP . " (user_id, group_id, user_time) VALUES ($user_id, $group_id, " . TIMENOW . ")"); return $group_id; } /** * Get group information * * @param string|int $group_id * @return array */ public static function get_group_data($group_id) { if ($group_id === 'all') { $sql = "SELECT g.*, u.username AS moderator_name, aa.group_id AS auth_mod FROM " . BB_GROUPS . " g LEFT JOIN " . BB_USERS . " u ON(g.group_moderator = u.user_id) LEFT JOIN " . BB_AUTH_ACCESS . " aa ON(aa.group_id = g.group_id AND aa.forum_perm & " . BF_AUTH_MOD . ") WHERE g.group_single_user = 0 GROUP BY g.group_id ORDER BY g.group_name"; } else { $sql = "SELECT g.*, u.username AS moderator_name, aa.group_id AS auth_mod FROM " . BB_GROUPS . " g LEFT JOIN " . BB_USERS . " u ON(g.group_moderator = u.user_id) LEFT JOIN " . BB_AUTH_ACCESS . " aa ON(aa.group_id = g.group_id AND aa.forum_perm & " . BF_AUTH_MOD . ") WHERE g.group_id = " . (int)$group_id . " AND g.group_single_user = 0 LIMIT 1"; } $method = ($group_id === 'all') ? 'fetch_rowset' : 'fetch_row'; return DB()->$method($sql); } /** * Delete user group permissions * * @param array|string $group_id * @param array|string $user_id * @param array|string $cat_id */ public static function delete_permissions($group_id = null, $user_id = null, $cat_id = null) { $group_id = get_id_csv($group_id); $user_id = get_id_csv($user_id); $cat_id = get_id_csv($cat_id); $forums_join_sql = ($cat_id) ? " INNER JOIN " . BB_FORUMS . " f ON(a.forum_id = f.forum_id AND f.cat_id IN($cat_id)) " : ''; if ($group_id) { DB()->query("DELETE a FROM " . BB_AUTH_ACCESS . " a $forums_join_sql WHERE a.group_id IN($group_id)"); } if ($user_id) { DB()->query("DELETE a FROM " . BB_AUTH_ACCESS_SNAP . " a $forums_join_sql WHERE a.user_id IN($user_id)"); } } /** * Save user group permissions * * @param int $group_id * @param array $auth_ary */ public static function store_permissions($group_id, $auth_ary) { if (empty($auth_ary) || !\is_array($auth_ary)) { return; } $values = array(); foreach ($auth_ary as $forum_id => $permission) { $values[] = array( 'group_id' => (int)$group_id, 'forum_id' => (int)$forum_id, 'forum_perm' => (int)$permission, ); } $values = DB()->build_array('MULTI_INSERT', $values); DB()->query("INSERT INTO " . BB_AUTH_ACCESS . $values); } /** * Update user group permissions * * @param string|array $user_id */ private static function update_user_permissions($user_id = 'all') { if (\is_array($user_id)) { $user_id = implode(',', $user_id); } $delete_in = ($user_id !== 'all') ? " WHERE user_id IN($user_id)" : ''; $users_in = ($user_id !== 'all') ? "AND ug.user_id IN($user_id)" : ''; DB()->query("DELETE FROM " . BB_AUTH_ACCESS_SNAP . $delete_in); DB()->query(" INSERT INTO " . BB_AUTH_ACCESS_SNAP . " (user_id, forum_id, forum_perm) SELECT ug.user_id, aa.forum_id, BIT_OR(aa.forum_perm) FROM " . BB_USER_GROUP . " ug, " . BB_GROUPS . " g, " . BB_AUTH_ACCESS . " aa WHERE ug.user_pending = 0 $users_in AND g.group_id = ug.group_id AND aa.group_id = g.group_id GROUP BY ug.user_id, aa.forum_id "); } /** * Delete empty groups with no users */ private static function delete_orphan_usergroups() { // GROUP_SINGLE_USER without AUTH_ACCESS DB()->query(" DELETE g FROM " . BB_GROUPS . " g LEFT JOIN " . BB_AUTH_ACCESS . " aa USING(group_id) WHERE g.group_single_user = 1 AND aa.group_id IS NULL "); // orphan USER_GROUP (against GROUP table) DB()->query(" DELETE ug FROM " . BB_USER_GROUP . " ug LEFT JOIN " . BB_GROUPS . " g USING(group_id) WHERE g.group_id IS NULL "); } }