function fetch_forum_parentlist($forumid) { global $vbulletin; if ($forumid == -1) { return '-1'; } $foruminfo = $vbulletin->db->query_first("SELECT parentid FROM " . TABLE_PREFIX . "forum WHERE forumid = {$forumid}"); $forumarray = $forumid; if ($foruminfo['parentid'] != 0) { $forumarray .= ',' . fetch_forum_parent_list($foruminfo['parentid']); } if (substr($forumarray, -2) != -1) { $forumarray .= '-1'; } return $forumarray; }
/** * Returns moderator permissions bitfield for the given forum and user * * @param integer Forum ID * @param integer User ID * @param boolean Include Global Permissions for Super Moderators * * @return integer */ function fetch_moderator_permissions($forumid, $userid = -1, $useglobalperms = false) { // gets permissions, depending on given userid and forumid global $vbulletin, $imodcache; static $modpermscache; $forumid = intval($forumid); if ($userid == -1) { $userid = $vbulletin->userinfo['userid']; } if (isset($modpermscache["$forumid"]["$userid"])) { DEVDEBUG(" CACHE \$modpermscache cache result"); return $modpermscache["$forumid"]["$userid"]; } $globalperms = array( 'permissions' => 0, 'permissions2' => 0, ); $getperms = array(); $hasglobalperms = false; if (isset($imodcache)) { if (isset($imodcache["$forumid"]["$userid"])) { DEVDEBUG(" CACHE first result from imodcache"); $getperms = $imodcache["$forumid"]["$userid"]; } else { $parentlist = explode(',', fetch_forum_parent_list($forumid)); foreach($parentlist AS $parentid) { // we dont want the super perms since we'll merge them when required further down if (isset($imodcache["$parentid"]["$userid"]) AND $parentid != -1) { DEVDEBUG(" CACHE looped result from imodcache"); $getperms = $imodcache["$parentid"]["$userid"]; } } } $globalperms['permissions'] = $imodcache['-1']["$userid"]['permissions']; $globalperms['permissions2'] = $imodcache['-1']["$userid"]['permissions2']; $hasglobalperms = isset($imodcache['-1']["$userid"]['permissions']); } else { $forumlist = fetch_forum_clause_sql($forumid, 'forumid'); if (!empty($forumlist)) { $forumlist = 'AND ' . $forumlist; } DEVDEBUG(" QUERY: get mod permissions for user $userid"); $perms = $vbulletin->db->query_read_slave(" (SELECT permissions, permissions2, FIND_IN_SET(forumid, '" . fetch_forum_parent_list($forumid) . "') AS pos, forumid FROM " . TABLE_PREFIX . "moderator WHERE userid = $userid $forumlist ORDER BY pos ASC LIMIT 1) UNION (SELECT permissions, permissions2, 0, forumid FROM " . TABLE_PREFIX . "moderator WHERE userid = $userid AND forumid = -1 ) "); while ($perm = $vbulletin->db->fetch_array($perms)) { if ($perm['forumid'] == -1) { $globalperms['permissions'] = $perm['permissions']; $globalperms['permission2'] = $perm['permissions2']; $hasglobalperms = true; } else { $getperms['permissions'] = $perm['permissions']; $getperms['permissions2'] = $perm['permissions2']; } } } if ($useglobalperms) { if (!$hasglobalperms) { // super mod without a record, give them all permissions $globalperms['permissions'] = array_sum($vbulletin->bf_misc_moderatorpermissions) - ($vbulletin->bf_misc_moderatorpermissions['newthreademail'] + $vbulletin->bf_misc_moderatorpermissions['newpostemail']); $globalperms['permissions2'] = array_sum($vbulletin->bf_misc_moderatorpermissions2); } $getperms['permissions'] = !empty($getperms['permissions']) ? intval($getperms['permissions']) : 0; $getperms['permissions'] |= intval($globalperms['permissions']); $getperms['permissions2'] = !empty($getperms['permissions2']) ? intval($getperms['permissions2']) : 0; $getperms['permissions2'] |= intval($globalperms['permissions2']); } $modpermscache["$forumid"]["$userid"]['permissions'] = intval($getperms['permissions']); $modpermscache["$forumid"]["$userid"]['permissions2'] = intval($getperms['permissions2']); return $modpermscache["$forumid"]["$userid"]; }