%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /data/www_bck/varak.cloud_bck/tracker.varak.cloud/src/Legacy/
Upload File :
Create Path :
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
	");
    }
}

Zerion Mini Shell 1.0