/** * Moderate users * * @param array $validate Validate information * @param bool $send_validated Whether to send email to users who have been accepted * @param bool $send_deleted Whether to send email to users who have been deleted * @return bool True if user accounts validated successfully */ public function moderate($validate, $send_validated, $send_deleted) { $this->checkHasAdminPermission('canadminusers'); if (empty($validate)) { throw new vB_Exception_Api('please_complete_required_fields'); } $evalemail_validated = array(); $evalemail_deleted = array(); $vboptions = vB::getDatastore()->getValue('options'); $usergroupcache = vB::getDatastore()->getValue('usergroupcache'); $bf_ugp_genericpermissions = vB::getDatastore()->getValue('bf_ugp_genericpermissions'); require_once DIR . '/includes/functions_misc.php'; if ($vboptions['welcomepm']) { if ($fromuser = vB_User::fetchUserInfo($vboptions['welcomepm'])) { cache_permissions($fromuser, false); } } foreach ($validate as $userid => $status) { $userid = intval($userid); $user = vB::getDbAssertor()->getRow('user', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, '#filters' => array('userid' => $userid))); if (!$user) { // use was likely deleted continue; } $username = unhtmlspecialchars($user['username']); $chosenlanguage = iif($user['languageid'] < 1, intval($vboptions['languageid']), intval($user['languageid'])); if ($status == 1) { // validated // init user data manager $displaygroupid = ($user['displaygroupid'] > 0 and $user['displaygroupid'] != $user['usergroupid']) ? $user['displaygroupid'] : 2; $userdata = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_ARRAY_UNPROCESSED); $userdata->set_existing($user); $userdata->set('usergroupid', 2); $userdata->set_usertitle($user['customtitle'] ? $user['usertitle'] : '', false, $usergroupcache["{$displaygroupid}"], $usergroupcache['2']['genericpermissions'] & $bf_ugp_genericpermissions['canusecustomtitle'] ? true : false, false); $userdata->save(); if ($userdata->has_errors(false)) { throw $userdata->get_exception(); } if ($send_validated) { if (!isset($evalemail_validated["{$user['languageid']}"])) { // note that we pass the "all languages" flag as true all the time because if the function does // caching internally and is not smart enough to check if the language requested the second time // was cached on the first pass -- so we make sure that we load and cache all language version // in case the second user has a different language from the first $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); $evalemail_deleted["{$user['languageid']}"] = vB_Api::instanceInternal('phrase')->fetchEmailPhrases('moderation_validated', array(vB5_Route::buildUrl($forumHome['routeid'] . '|fullurl'), $username, $vboptions['bbtitle'], $vboptions['bburl']), array($vboptions['bbtitle']), $chosenlanguage); } vB_Mail::vbmail($user['email'], $evalemail_deleted["{$user['languageid']}"]['subject'], $evalemail_deleted["{$user['languageid']}"]['message'], true); } if ($vboptions['welcomepm'] and $fromuser and !$user['posts']) { $userdata = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_STANDARD); $userdata->send_welcomepm(null, $user['userid']); } } else { if ($status == -1) { // deleted if ($send_deleted) { if (!isset($evalemail_deleted["{$user['languageid']}"])) { // note that we pass the "all languages" flag as true all the time because if the function does // caching internally and is not smart enough to check if the language requested the second time // was cached on the first pass -- so we make sure that we load and cache all language version // in case the second user has a different language from the first $evalemail_deleted["{$user['languageid']}"] = vB_Api::instanceInternal('phrase')->fetchEmailPhrases('moderation_deleted', array($username, $vboptions['bbtitle']), array($vboptions['bbtitle']), $chosenlanguage); } vB_Mail::vbmail($user['email'], $evalemail_deleted["{$user['languageid']}"]['subject'], $evalemail_deleted["{$user['languageid']}"]['message'], true); } $userdm = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_SILENT); $userdm->set_existing($user); $userdm->delete(); unset($userdm); } } // else, do nothing } // rebuild stats so new user displays on forum home require_once DIR . '/includes/functions_databuild.php'; build_user_statistics(); return true; }
/** * Update user's display group * * @param $userid User ID * @param $usergroupid Usergroup ID to be used as display group * @return void */ public function updateDisplayGroup($userid, $usergroupid) { $userinfo = vB_Api::instanceInternal('user')->fetchUserinfo($userid); $membergroups = fetch_membergroupids_array($userinfo); $permissions = $userinfo['permissions']; $vbulletin = vB::get_registry(); $bf_ugp_genericpermissions = vB::getDatastore()->get_value('bf_ugp_genericpermissions'); if ($usergroupid == 0) { throw new vB_Exception_Api('invalidid', array('usergroupid')); } if (!in_array($usergroupid, $membergroups)) { throw new vB_Exception_Api('notmemberofdisplaygroup'); } else { $display_usergroup = $vbulletin->usergroupcache["{$usergroupid}"]; //I'm not sure why we require canoverride to set the display group... this is *not* required //by the the admincp user interface which uses a different method of saving. if ($usergroupid == $userinfo['usergroupid'] or $display_usergroup['canoverride']) { $userinfo['displaygroupid'] = $usergroupid; // init user data manager $userdata = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_ARRAY_UNPROCESSED); $userdata->set_existing($userinfo); $userdata->set('displaygroupid', $usergroupid); if (!$userinfo['customtitle']) { $userdata->set_usertitle($userinfo['customtitle'] ? $userinfo['usertitle'] : '', false, $display_usergroup, $permissions['genericpermissions'] & $bf_ugp_genericpermissions['canusecustomtitle'] ? true : false, $permissions['genericpermissions'] & $bf_ugp_genericpermissions['cancontrolpanel'] ? true : false); } $userdata->save(); } else { throw new vB_Exception_Api('usergroup_invaliddisplaygroup'); } } }
} } $users = vB::getDbAssertor()->assertQuery('user', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, vB_dB_Query::CONDITIONS_KEY => array(array('field' => 'userid', 'value' => array_keys($vbulletin->GPC['validate']), 'operator' => vB_dB_Query::OPERATOR_EQ)))); // foreach($vbulletin->GPC['validate'] AS $userid => $status) foreach ($users as $user) { $status = $vbulletin->GPC['validate'][$user['userid']]; $username = unhtmlspecialchars($user['username']); $chosenlanguage = iif($user['languageid'] < 1, intval($vbulletin->options['languageid']), intval($user['languageid'])); if ($status == 1) { // validated // init user data manager $displaygroupid = ($user['displaygroupid'] > 0 and $user['displaygroupid'] != $user['usergroupid']) ? $user['displaygroupid'] : 2; $userdata = new vB_Datamanager_User($vbulletin, vB_DataManager_Constants::ERRTYPE_CP); $userdata->set_existing($user); $userdata->set('usergroupid', 2); $userdata->set_usertitle($user['customtitle'] ? $user['usertitle'] : '', false, $vbulletin->usergroupcache["{$displaygroupid}"], $vbulletin->usergroupcache['2']['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canusecustomtitle'] ? true : false, false); $userdata->save(); vB_Cache::instance(vB_Cache::CACHE_FAST)->event(array('userPerms_' . $user['userid'], 'userChg_' . $user['userid'])); vB_Cache::instance(vB_Cache::CACHE_LARGE)->event(array('userPerms_' . $user['userid'], 'userChg_' . $user['userid'])); if ($vbulletin->GPC['send_validated']) { if (!isset($evalemail_validated["{$user['languageid']}"])) { //note that we pass the "all languages" flag as true all the time because if the function does //caching internally and is not smart enough to check if the language requested the second time //was cached on the first pass -- so we make sure that we load and cache all language version //in case the second user has a different language from the first $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); $evalemail_deleted["{$user['languageid']}"] = vB_Api::instanceInternal('phrase')->fetchEmailPhrases('moderation_validated', array(vB5_Route::buildUrl($forumHome['routeid'] . '|fullurl'), $username, $vboptions['bbtitle'], $vboptions['bburl']), array($vboptions['bbtitle']), $chosenlanguage); } vB_Mail::vbmail($user['email'], $evalemail_deleted["{$user['languageid']}"]['subject'], $evalemail_deleted["{$user['languageid']}"]['message'], true); } if ($vbulletin->options['welcomepm'] and $fromuser and !$user['posts']) {
/** * Additional data to update after a save call (such as denormalized values in other tables). * * @param boolean Do the query? */ function post_save_each($doquery = true) { $moderatorid = $this->fetch_field('moderatorid'); // update usergroupid / membergroupids if (!$this->condition and !in_array($this->moderator['userid'], explode(',', $this->config['SpecialUsers']['undeletableusers'])) and can_administer('canadminusers')) { $update_usergroupid = $this->info['usergroupid'] > 0; $update_membergroup = (!empty($this->info['membergroupids']) and is_array($this->info['membergroupids'])); if ($update_usergroupid or $update_membergroup) { $userdata = new vB_Datamanager_User($this->registry, vB_DataManager_Constants::ERRTYPE_SILENT); if (!$this->info['user'] and $this->moderator['userid']) { $this->info['user'] = fetch_userinfo($this->moderator['userid']); } $userdata->set_existing($this->info['user']); cache_permissions($this->info['user'], false); $displaygroupid = $update_usergroupid ? $this->info['usergroupid'] : $this->info['user']['displaygroupid']; $this->usergroupcache = vB::getDatastore()->get_value('usergroupcache'); $userdata->set_usertitle($this->info['user']['customtitle'] ? $this->info['user']['usertitle'] : '', false, $this->usergroupcache["{$displaygroupid}"], ($this->info['user']['customtitle'] == 1 or $this->info['user']['permissions']['genericpermissions'] & $this->bf_ugp_genericpermissions['canusecustomtitle']) ? true : false, $this->info['user']['customtitle'] == 1 ? true : false); $userdata->set_failure_callback(array(&$this, 'update_user_failed_insert')); if ($update_usergroupid) { $userdata->set('usergroupid', $this->info['usergroupid']); $userdata->set('displaygroupid', $this->info['usergroupid']); } if ($update_membergroup) { $membergroupids = preg_split('#,#', $this->info['user']['membergroupids'], -1, PREG_SPLIT_NO_EMPTY); $membergroupids = array_unique(array_merge($membergroupids, $this->info['membergroupids'])); if ($key = array_search($this->info['user']['usergroupid'], $membergroupids)) { unset($membergroupids["{$key}"]); } sort($membergroupids); $userdata->set('membergroupids', $membergroupids); } if ($userdata->errors) { $this->errors = array_merge($this->errors, $userdata->errors); return; } $userdata->save(); } } if (!$this->condition and !$this->options['ignoremods']) { $rebuild_ignore_list = array(); $ignored_moderators = $this->assertor->getRows('userlist', array('relationid' => $this->fetch_field('userid'), 'type' => 'ignore')); foreach ($ignored_moderators as $ignored_moderator) { $rebuild_ignore_list[] = $ignored_moderator['userid']; } if (!empty($rebuild_ignore_list)) { require_once DIR . '/includes/functions_databuild.php'; $this->assertor->delete('userlist', array('relationid' => $this->fetch_field('userid'), 'type' => 'ignore')); foreach ($rebuild_ignore_list as $userid) { build_userlist($userid); } } } // Legacy Hook 'moderatordata_postsave' Removed // vB_Cache::instance(vB_Cache::CACHE_FAST)->event('userPerms_' . $this->moderator['userid']); }
} echo '<p>' . $vbphrase['updating_user_info'] . '</p>'; $tmp_usergroup_cache = array(); $infractiongroups = array(); $groups = $vbulletin->db->query_read("\n\t\tSELECT usergroupid, orusergroupid, pointlevel, override\n\t\tFROM " . TABLE_PREFIX . "infractiongroup\n\t\tORDER BY pointlevel\n\t"); while ($group = $vbulletin->db->fetch_array($groups)) { $infractiongroups["{$group['usergroupid']}"]["{$group['pointlevel']}"][] = array('orusergroupid' => $group['orusergroupid'], 'override' => $group['override']); } $users = $vbulletin->db->query_read("\n\t\tSELECT user.*, usertextfield.rank,\n\t\tIF(user.displaygroupid=0, user.usergroupid, user.displaygroupid) AS displaygroupid\n\t\tFROM " . TABLE_PREFIX . "user AS user\n\t\tLEFT JOIN " . TABLE_PREFIX . "usertextfield AS usertextfield USING (userid)\n\t\tWHERE user.userid >= " . $vbulletin->GPC['startat'] . "\n\t\tORDER BY user.userid\n\t\tLIMIT " . $vbulletin->GPC['perpage']); $finishat = $vbulletin->GPC['startat']; $infractionLibrary = vB_Library::instance('Content_Infraction'); while ($user = $vbulletin->db->fetch_array($users)) { $userdm = new vB_Datamanager_User($vbulletin, vB_DataManager_Constants::ERRTYPE_CP); $userdm->set_existing($user); cache_permissions($user, false); $userdm->set_usertitle($user['customtitle'] ? $user['usertitle'] : '', false, $vbulletin->usergroupcache["{$user['displaygroupid']}"], ($user['customtitle'] == 1 or $user['permissions']['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canusecustomtitle']) ? true : false, $user['customtitle'] == 1 ? true : false); if ($lastpost = $vbulletin->db->query_first("SELECT MAX(publishdate) AS dateline FROM " . TABLE_PREFIX . "node WHERE userid = {$user['userid']}")) { $lastpost['dateline'] = intval($lastpost['dateline']); } else { $lastpost['dateline'] = 0; } $infractioninfo = $infractionLibrary->fetchInfractionGroups($infractiongroups, $user['userid'], $user['ipoints'], $user['usergroupid']); $userdm->set('infractiongroupids', $infractioninfo['infractiongroupids']); $userdm->set('infractiongroupid', $infractioninfo['infractiongroupid']); $userdm->set('posts', $user['posts']); // This will activate the rank update $userdm->set('lastpost', $lastpost['dateline']); $userdm->save(); unset($userdm); echo construct_phrase($vbphrase['processing_x'], $user['userid']) . "<br />\n"; vbflush();