/** * Shows the form for inline mod authentication. */ function show_inline_mod_login($showerror = false) { global $vbulletin, $vbphrase, $show; $show['inlinemod_form'] = true; $show['passworderror'] = $showerror; if (!$showerror) { $vbulletin->url = SCRIPTPATH; } $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); eval(standard_error(fetch_error('nopermission_loggedin', $vbulletin->userinfo['username'], vB_Template_Runtime::fetchStyleVar('right'), vB::getCurrentSession()->get('sessionurl'), $vbulletin->userinfo['securitytoken'], vB5_Route::buildUrl($forumHome['routeid'] . 'home|fullurl')))); }
/** * @see vB_Notification::fetchPhraseArray() */ public static function fetchPhraseArray($notificationData) { $userid = $notificationData['sender']; $username = $notificationData['sender_username']; $userInfo = array('userid' => $userid, 'username' => $username); try { $userProfileUrl = vB5_Route::buildUrl('profile|fullurl', $userInfo); } catch (Exception $e) { $userProfileUrl = "#"; } $phraseTitle = "x_accepted_follow_request"; $phraseData = array($username, $userProfileUrl); return array($phraseTitle, $phraseData); }
/** * @see vB_Notification::fetchPhraseArray() */ public static function fetchPhraseArray($notificationData) { $nodelink = vB5_Route::buildUrl('node|fullurl', array('nodeid' => $notificationData['sentbynodeid'])); $phraseTitle = "missing phrase for " . __CLASS__; $phraseData = array(); if (empty($notificationData['sender']) or is_null($notificationData['sender_username'])) { switch ($notificationData['otherParticipantsCount']) { case 0: $phraseTitle = 'guest_replied_to_z'; // There's a 'guest_replied_to_y' phrase being used bo other templates. $phraseData = array($nodelink, $notificationData['aboutstartertitle']); break; case 1: $phraseTitle = 'guest_and_one_other_replied_to_z'; $phraseData = array($notificationData['sentbynodeid'], $nodelink, $notificationData['aboutstartertitle']); break; default: $phraseTitle = 'guest_and_y_others_replied_to_z'; $phraseData = array($notificationData['sentbynodeid'], $notificationData['otherParticipantsCount'], $nodelink, $notificationData['aboutstartertitle']); break; } } else { $userid = $notificationData['sender']; $username = $notificationData['sender_username']; $userInfo = array('userid' => $userid, 'username' => $username); try { $userProfileUrl = vB5_Route::buildUrl('profile|fullurl', $userInfo); } catch (Exception $e) { $userProfileUrl = "#"; } switch ($notificationData['otherParticipantsCount']) { case 0: $phraseTitle = 'x_replied_to_z'; $phraseData = array($userProfileUrl, $username, $nodelink, $notificationData['aboutstartertitle']); break; case 1: $phraseTitle = 'x_and_one_other_replied_to_z'; $phraseData = array($userProfileUrl, $username, $notificationData['sentbynodeid'], $nodelink, $notificationData['aboutstartertitle']); break; default: $phraseTitle = 'x_and_y_others_replied_to_z'; $phraseData = array($userProfileUrl, $username, $notificationData['sentbynodeid'], $notificationData['otherParticipantsCount'], $nodelink, $notificationData['aboutstartertitle']); break; } } return array($phraseTitle, $phraseData); }
public function getBreadcrumbs() { $breadcrumbs = array(array('phrase' => 'inbox', 'url' => vB5_Route::buildUrl('privatemessage'))); try { $folder = vB_Api::instanceInternal('content_privatemessage')->getFolderInfoFromId($this->folderid); if (isset($folder[$this->folderid]) and $folder[$this->folderid]['iscustom']) { $breadcrumbs[] = array('title' => $folder[$this->folderid]['title'], 'url' => ''); } else { if (isset($folder[$this->folderid]) and !$folder[$this->folderid]['iscustom']) { $breadcrumbs[] = array('phrase' => $folder[$this->folderid]['title'], 'url' => ''); } } } catch (vB_Exception_Api $e) { // something went wrong... don't display that crumb } return $breadcrumbs; }
public function __construct($routeInfo, $matches, $queryString = '', $anchor = '') { if (empty($matches['tab'])) { $matches['tab'] = 'profile'; } parent::__construct($routeInfo, $matches, $queryString, $anchor); if (empty($this->arguments['userid'])) { $userInfo = vB::getCurrentSession()->fetch_userinfo(); $this->arguments['userid'] = $userInfo['userid']; $this->arguments['username'] = $userInfo['username']; } else { if (empty($this->arguments['username'])) { $userInfo = vB_User::fetchUserinfo($this->arguments['userid']); $this->arguments['username'] = $userInfo['username']; } } $this->breadcrumbs = array(0 => array('title' => $this->arguments['username'], 'url' => vB5_Route::buildUrl('profile', array('userid' => $this->arguments['userid'], 'username' => vB_String::getUrlIdent($this->arguments['username'])))), 1 => array('phrase' => 'user_settings', 'url' => '')); }
public function __construct($routeInfo, $matches, $queryString = '', $anchor = '') { parent::__construct($routeInfo, $matches, $queryString, $anchor); $this->arguments['userid'] = intval($this->arguments['userid']); $userInfo = vB_Api::instanceInternal('user')->fetchProfileInfo($this->arguments['userid']); if (empty($this->arguments['userid'])) { $this->arguments['userid'] = $userInfo['userid']; $this->arguments['username'] = $userInfo['username']; } else { if (empty($this->arguments['username'])) { $this->arguments['username'] = $userInfo['username']; } } if ($this->arguments['tab'] == 'subscriptions' and !$userInfo['showSubscriptions']) { throw new vB_Exception_NodePermission('subscriptions'); } else { if ($this->arguments['tab'] == 'subscribers' and !$userInfo['showSubscribers']) { throw new vB_Exception_NodePermission('subscribers'); } } $this->breadcrumbs = array(0 => array('title' => $this->arguments['username'], 'url' => vB5_Route::buildUrl('profile', array('userid' => $this->arguments['userid'], 'username' => vB_String::getUrlIdent($this->arguments['username'])))), 1 => array('phrase' => $this->arguments['tab'], 'url' => '')); }
public function __construct($routeInfo, $matches, $queryString = '', $anchor) { // if no action is defined, use index if (!isset($matches['action']) || empty($matches['action'])) { $matches['action'] = 'index'; } // set action class $actionClassName = 'vB5_Route_PrivateMessage_' . ucfirst($matches['action']); $this->actionClass = new $actionClassName($routeInfo, $matches, $queryString); // Add action to arguments (required for rebuilding the URL for this action) $routeInfo['arguments']['action'] = $matches['action']; $this->actionInternal = $matches['action']; parent::__construct($routeInfo, $matches, $queryString, $anchor); // add action parameters to route arguments $actionParameters = $this->actionClass->getParameters(); $this->arguments = empty($this->arguments) ? $actionParameters : array_merge($this->arguments, $actionParameters); // This might need to be changed into switch statement with cases that can be applied for different locations in the message center if (!empty($this->arguments['messageid'])) { $msgInfo = vB_Library::instance('node')->getNodeBare($actionParameters['messageid']); $senderUrl = vB5_Route::buildUrl('profile', $msgInfo); $this->setUserAction('viewing_private_message', $msgInfo['authorname'], $senderUrl); } else { $this->setUserAction('viewing_private_message'); } // set breadcrumbs $this->breadcrumbs = $this->actionClass->getBreadcrumbs(); // add querystring parameters for permalink (similar to vB5_Route_Conversation) if (!empty($matches['nodeid']) and $nodeId = intval($matches['nodeid']) and !empty($matches['innerPost']) and $innerPost = intval($matches['innerPost'])) { if ($innerPost != $nodeId) { // it's not the starter, either a reply or a comment $this->queryParameters['p'] = intval($matches['innerPost']); if (isset($matches['innerPostParent']) and $innerPostParent = intval($matches['innerPostParent']) and $nodeId != $innerPostParent) { // it's a comment $this->queryParameters['pp'] = $innerPostParent; } } } }
public function __construct($routeInfo, $matches, $queryString = '', $anchor = '') { parent::__construct($routeInfo, $matches, $queryString, $anchor); if (empty($matches['nodeid'])) { throw new vB_Exception_Router('invalid_request'); } else { $vmchannel = vB_Library::instance('node')->fetchVMChannel(); if (!empty($vmchannel)) { $this->arguments['channelid'] = $vmchannel; } $routeInfo['nodeid'] = $matches['nodeid']; $this->arguments['nodeid'] = $matches['nodeid']; $this->arguments['contentid'] = $matches['nodeid']; } if (!empty($matches['title'])) { $routeInfo['title'] = $matches['title']; $this->arguments['title'] = $matches['title']; } $node = vB_Library::instance('node')->getNodeBare($this->arguments['nodeid']); if (!empty($routeInfo['title'])) { $this->arguments['title'] = vB_String::getUrlIdent($routeInfo['title']); // @TODO handle this in another way. $phrases = vB_Api::instanceInternal("phrase")->fetch(array('visitor_message_from_x')); $this->arguments['title'] = sprintf($phrases['visitor_message_from_x'], $node['authorname']); } // get userid and username if (empty($this->arguments['userid'])) { //get userInfo if ($node['setfor']) { $user = vB_Api::instanceInternal('user')->fetchUsernames(array($node['setfor'])); $user = $user[$node['setfor']]; $this->arguments['userid'] = $node['setfor']; $this->arguments['username'] = $user['username']; } } $this->breadcrumbs = array(0 => array('title' => $this->arguments['username'], 'url' => vB5_Route::buildUrl('profile', array('userid' => $this->arguments['userid'], 'username' => vB_String::getUrlIdent($this->arguments['username'])))), 1 => array('phrase' => 'visitor_message', 'url' => '')); }
/** * Builds pagination previous and next URLs. * * @param int The current page number. * @param int The total number of pages. * @param Array The route information containing routeId, arguments and queryParameters. * @return Array The pagination array containing prevurl and nexturl. Returns false if routeId is not specified or invalid or if there is only one page. */ protected function buildPaginationURLs($page = 1, $totalpages = 1, $routeInfo = array()) { //if the caller did not pass routeId or there is only one page, then don't build the prev and next URLs if (isset($routeInfo['routeId']) and intval($routeInfo['routeId']) > 0 and ($page < $totalpages or $page > 1)) { $prevUrl = $nextUrl = ''; $baseUrl = vB::getDatastore()->getOption('frontendurl'); if ($page < $totalpages) { $routeInfo['arguments']['pagenum'] = $page + 1; $nextUrl = $baseUrl . vB5_Route::buildUrl($routeInfo['routeId'], $routeInfo['arguments'], $routeInfo['queryParameters']); } if ($page > 1) { $routeInfo['arguments']['pagenum'] = $page - 1; $prevUrl = $baseUrl . vB5_Route::buildUrl($routeInfo['routeId'], $routeInfo['arguments'], $routeInfo['queryParameters']); } return array('prevurl' => $prevUrl, 'nexturl' => $nextUrl); } return false; }
$action .= ', \'' . $log['threadtitle'] . '\''; } } else { // vB5 logs $temp = array(); $logdata = @unserialize($log['action']); $action = construct_phrase($vbphrase[$phrase], $log['username']); if ($logdata['userid'] and $logdata['username']) { $name = '<a href="user.php?' . vB::getCurrentSession()->get('sessionurl') . 'do=edit&u=' . $logdata['userid'] . '">' . $logdata['username'] . '</a>'; $temp[] = $vbphrase['author'] . ' = ' . $name; unset($logdata['userid'], $logdata['username']); } $logdata['nodeid'] = $log['nodeid']; $title = $log['nodetitle'] ? $log['nodetitle'] : $vbphrase['untitled']; if ($log['routeid']) { $titleurl = vB5_Route::buildUrl($log['routeid'] . '|fullurl', array('nodeid' => $log['nodeid'], 'title' => $title, 'innerPost' => $log['nodeid']), array(), '#post' . $log['nodeid']); $logdata['title'] = '<a href="' . $titleurl . '">' . $title . '</a>'; } else { $logdata['title'] = $title; } if (!empty($logdata)) { foreach ($logdata as $key => $data) { $temp[] = "{$key} = {$data}"; } $action .= '<br />' . implode('; ', $temp); } } } else { $action = '-'; } $cell[] = $action;
/** * Fetch notices to be displayed * * @param int $channelid Current Channel ID * @param array $ignore_np_notices Ignored non-persistent notice ids * @param boolean Whether or not to do the phrase replacement, if false, the client is responsible * @return array Notices * * @see fetch_relevant_notice_ids() */ public function fetch($channelid = 0, $ignore_np_notices = array(), $replace_phrases = false) { if ($channelid) { $channelapi = vB_Api::instanceInternal('content_channel'); // This is to verify $channelid $channelapi->fetchChannelById($channelid); } $noticecache = vB::getDatastore()->getValue('noticecache'); $userinfo = vB::getCurrentSession()->fetch_userinfo(); $vboptions = vB::getDatastore()->getValue('options'); $display_notices = array(); foreach ($noticecache as $noticeid => $notice) { foreach ($notice as $criteriaid => $conditions) { switch ($criteriaid) { case 'persistent': if ($conditions == 0 and is_array($ignore_np_notices) and in_array($noticeid, $ignore_np_notices)) { continue 3; } break; case 'dismissible': if ($conditions == 1 and in_array($noticeid, $this->fetchDismissedNotices())) { continue 3; } break; /*case 'notice_x_not_displayed': // this is now handled differently - see $remove_display_notices below { if (in_array(intval($conditions[0]), $display_notices)) { continue 3; } break; }*/ /*case 'notice_x_not_displayed': // this is now handled differently - see $remove_display_notices below { if (in_array(intval($conditions[0]), $display_notices)) { continue 3; } break; }*/ case 'in_usergroup_x': if (!is_member_of($userinfo, intval($conditions[0]))) { continue 3; } break; case 'not_in_usergroup_x': if (is_member_of($userinfo, intval($conditions[0]))) { continue 3; } break; case 'browsing_forum_x': if (!$channelid or $channelid != intval($conditions[0])) { continue 3; } break; case 'browsing_forum_x_and_children': if (!$channelid) { continue 3; } $parents = vB_Library::instance('node')->getParents($channelid); $parentids = array(); foreach ($parents as $parent) { if ($parent['nodeid'] != 1) { $parentids[] = $parent['nodeid']; } } if (!in_array(intval($conditions[0]), $parentids)) { continue 3; } break; case 'no_visit_in_x_days': if ($userinfo['lastvisit'] > vB::getRequest()->getTimeNow() - $conditions[0] * 86400) { continue 3; } break; case 'has_never_posted': if ($userinfo['posts'] > 0) { continue 3; } break; case 'no_posts_in_x_days': if ($userinfo['lastpost'] == 0 or $userinfo['lastpost'] > vB::getRequest()->getTimeNow() - $conditions[0] * 86400) { continue 3; } break; case 'has_x_postcount': if (!$this->checkNoticeCriteriaBetween($userinfo['posts'], $conditions[0], $conditions[1])) { continue 3; } break; case 'has_x_reputation': if (!$this->checkNoticeCriteriaBetween($userinfo['reputation'], $conditions[0], $conditions[1])) { continue 3; } break; case 'has_x_infraction_points': if (!$this->checkNoticeCriteriaBetween($userinfo['ipoints'], $conditions[0], $conditions[1])) { continue 3; } break; case 'pm_storage_x_percent_full': if ($userinfo['permissions']['pmquota']) { $pmboxpercentage = $userinfo['pmtotal'] / $userinfo['permissions']['pmquota'] * 100; if (!$this->checkNoticeCriteriaBetween($pmboxpercentage, $conditions[0], $conditions[1])) { continue 3; } } else { continue 3; } break; case 'username_is': if (strtolower($userinfo['username']) != strtolower(trim($conditions[0]))) { continue 3; } break; case 'is_birthday': if (substr($userinfo['birthday'], 0, 5) != vbdate('m-d', vB::getRequest()->getTimeNow(), false, false)) { continue 3; } break; case 'came_from_search_engine': if (!is_came_from_search_engine()) { continue 3; } break; case 'style_is_x': if (STYLEID != intval($conditions[0])) { continue 3; } break; case 'in_coventry': if (!in_array($userinfo['userid'], preg_split('#\\s+#', $vboptions['globalignore'], -1, PREG_SPLIT_NO_EMPTY))) { continue 3; } break; case 'is_date': if (empty($conditions[1]) and vbdate('d-m-Y', vB::getRequest()->getTimeNow(), false, false) != $conditions[0]) { continue 3; } else { if ($conditions[1] and gmdate('d-m-Y', vB::getRequest()->getTimeNow()) != $conditions[0]) { continue 3; } } break; case 'is_time': if (preg_match('#^(\\d{1,2}):(\\d{2})$#', $conditions[0], $start_time) and preg_match('#^(\\d{1,2}):(\\d{2})$#', $conditions[1], $end_time)) { if (empty($conditions[2])) { $start = mktime($start_time[1], $start_time[2]) + $vboptions['hourdiff']; $end = mktime($end_time[1], $end_time[2]) + $vboptions['hourdiff']; $now = mktime() + $vboptions['hourdiff']; } else { $start = gmmktime($start_time[1], $start_time[2]); $end = gmmktime($end_time[1], $end_time[2]); $now = gmmktime(); } if ($now < $start or $now > $end) { continue 3; } } else { continue 3; } break; default: $abort = false; if ($abort) { continue 3; } } } $display_notices["{$noticeid}"] = $noticeid; } // now go through removing notices using the 'notice_x_not_displayed' criteria $remove_display_notices = array(); foreach ($noticecache as $noticeid => $notice) { if (isset($notice['notice_x_not_displayed']) and isset($display_notices[intval($notice['notice_x_not_displayed'][0])])) { $remove_display_notices["{$noticeid}"] = $noticeid; } } foreach ($remove_display_notices as $noticeid) { unset($display_notices["{$noticeid}"]); } $return = array(); if ($display_notices) { if ($replace_phrases) { // Prefech phrases $phrases = array(); foreach ($display_notices as $display_notice) { $phrases[] = "notice_{$display_notice}_html"; } $vbphrase = vB_Api::instanceInternal('phrase')->fetch($phrases); foreach ($display_notices as $display_notice) { $notice_html = str_replace(array('{musername}', '{username}', '{userid}', '{sessionurl}', '{sessionurl_q}', '{register_page}', '{help_page}'), array($userinfo['musername'], $userinfo['username'], $userinfo['userid'], vB::getCurrentSession()->get('sessionurl'), vB::getCurrentSession()->get('sessionurl_q'), vB5_Route::buildUrl('register|fullurl'), vB5_Route::buildUrl('help|fullurl')), $vbphrase["notice_{$display_notice}_html"]); $return[$display_notice] = $noticecache[$display_notice]; $return[$display_notice]['notice_html'] = $notice_html; } } else { foreach ($display_notices as $display_notice) { $return[$display_notice] = $noticecache[$display_notice]; $return[$display_notice]['notice_phrase_varname'] = "notice_{$display_notice}_html"; } } } return $return; }
protected function checkIpBan() { $user_ipaddress = IPADDRESS . '.'; $options = vB::getDatastore()->get_value('options'); $ajaxroute = isset($this->segments['route']) ? $this->segments['route'] : ''; if ($options['enablebanning'] == 1 and $options['banip'] = trim($options['banip'])) { $addresses = preg_split('#\\s+#', $options['banip'], -1, PREG_SPLIT_NO_EMPTY); foreach ($addresses as $banned_ip) { if (strpos($banned_ip, '*') === false and $banned_ip[strlen($banned_ip) - 1] != '.') { $banned_ip .= '.'; } $banned_ip_regex = str_replace('\\*', '(.*)', preg_quote($banned_ip, '#')); if (preg_match('#^' . $banned_ip_regex . '#U', $user_ipaddress)) { $excluded = (!empty($this->location['contactus']) or $ajaxroute == '/api/phrase/fetch' or $ajaxroute == '/api/contactus/sendmail'); if (!$excluded) { return array('error' => 'banip', 'args' => vB5_Route::buildUrl('contact-us|fullurl')); } } } } return false; }
/** * Fetches the 'url' variable - usually the URL of the previous page in the history * * @return string */ function fetch_url() { $scriptpath = vB::getRequest()->getScriptPath(); //note regarding the default url if not set or inappropriate. //started out as index.php then moved to options['forumhome'] . '.php' when that option was added. //now we've changed to to the forumhome url since there is now quite a bit of logic around that. //Its not clear, however, with the expansion of vb if that's the most appropriate generic landing //place (perhaps it *should* be index.php). //In any case there are several places in the code that check for the default page url and change it //to something more appropriate. If the default url changes, so do those checks. //The solution is, most likely, to make some note when vbulletin->url is the default so it can be overridden //without worrying about what the exact text is. if (empty($_REQUEST['url'])) { $url = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; } else { $temp_url = $_REQUEST['url']; if (!empty($_SERVER['HTTP_REFERER']) and $temp_url == $_SERVER['HTTP_REFERER']) { //$url = 'index.php'; $url = vB5_Route::buildUrl('home|fullurl'); } else { $url = $temp_url; } } if ($url == $scriptpath or empty($url)) { //$url = 'index.php'; $url = vB5_Route::buildUrl('home|fullurl'); } $url = $this->registry->cleaner->xssClean($url); return $url; }
/** * Ban users * * @param array $userids Userids to ban * @param int $banusergroupid Which banned usergroup to move the users to * @param string $period Ban period * @param string $reason Ban reason */ public function banUsers($userids, $banusergroupid, $period, $reason = '') { $loginuser =& vB::getCurrentSession()->fetch_userinfo(); $usercontext =& vB::getUserContext($loginuser['userid']); if (!$usercontext->hasAdminPermission('cancontrolpanel') and !$usercontext->hasPermission('moderatorpermissions', 'canbanusers')) { $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); throw new vB_Exception_Api('nopermission_loggedin', array($loginuser['username'], vB_Template_Runtime::fetchStyleVar('right'), vB::getCurrentSession()->get('sessionurl'), $loginuser['securitytoken'], vB5_Route::buildUrl($forumHome['routeid'] . '|fullurl'))); } foreach ($userids as &$userid) { $userid = intval($userid); } $bannedusergroups = vB_Api::instanceInternal('usergroup')->fetchBannedUsergroups(); if (!in_array($banusergroupid, array_keys($bannedusergroups))) { throw new vB_Exception_Api('invalid_usergroup_specified'); } // check that the number of days is valid if ($period != 'PERMANENT' and !preg_match('#^(D|M|Y)_[1-9][0-9]?$#', $period)) { throw new vB_Exception_Api('invalid_ban_period_specified'); } if ($period == 'PERMANENT') { // make this ban permanent $liftdate = 0; } else { // get the unixtime for when this ban will be lifted require_once DIR . '/includes/functions_banning.php'; $liftdate = convert_date_to_timestamp($period); } $user_dms = array(); $current_bans = vB::getDbAssertor()->getRows('user_fetchcurrentbans', array('userids' => $userids)); foreach ($current_bans as $current_ban) { $userinfo = vB_User::fetchUserinfo($current_ban['userid']); $userid = $userinfo['userid']; if ($current_ban['bandate']) { // they already have a ban, check if the current one is being made permanent, continue if its not if ($liftdate and $liftdate < $current_ban['liftdate']) { continue; } // there is already a record - just update this record vB::getDbAssertor()->update('userban', array('bandate' => vB::getRequest()->getTimeNow(), 'liftdate' => $liftdate, 'adminid' => $loginuser['userid'], 'reason' => $reason), array('userid' => $userinfo['userid'])); } else { // insert a record into the userban table /*insert query*/ vB::getDbAssertor()->insert('userban', array('userid' => $userinfo['userid'], 'usergroupid' => $userinfo['usergroupid'], 'displaygroupid' => $userinfo['displaygroupid'], 'customtitle' => $userinfo['customtitle'], 'usertitle' => $userinfo['usertitle'], 'adminid' => $loginuser['userid'], 'bandate' => vB::getRequest()->getTimeNow(), 'liftdate' => $liftdate, 'reason' => $reason)); } // update the user record $user_dms[$userid] = new vB_Datamanager_User(vB_DataManager_Constants::ERRTYPE_SILENT); $user_dms[$userid]->set_existing($userinfo); $user_dms[$userid]->set('usergroupid', $banusergroupid); $user_dms[$userid]->set('displaygroupid', 0); // update the user's title if they've specified a special user title for the banned group if ($bannedusergroups[$banusergroupid]['usertitle'] != '') { $user_dms[$userid]->set('usertitle', $bannedusergroups[$banusergroupid]['usertitle']); $user_dms[$userid]->set('customtitle', 0); } $user_dms[$userid]->pre_save(); } foreach ($user_dms as $userdm) { $userdm->save(); } // and clear perms foreach ($userids as $uid) { vB::getUserContext($uid)->clearChannelPermissions(); } return true; }
/** * Fetch a list of banned usergroups */ public function fetchBannedUsergroups() { $loginuser =& vB::getCurrentSession()->fetch_userinfo(); $usercontext =& vB::getUserContext($loginuser['userid']); if (!$usercontext->hasAdminPermission('cancontrolpanel') and !$usercontext->getChannelPermission('moderatorpermissions', 'canbanusers', 1)) { $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); $args = array($loginuser['username']); $args[] = vB_Template_Runtime::fetchStyleVar('right'); $args[] = vB::getCurrentSession()->get('sessionurl'); $args[] = $loginuser['securitytoken']; $args[] = vB5_Route::buildUrl($forumHome['routeid'] . '|fullurl'); throw new vB_Exception_Api('nopermission_loggedin', $args); } $bf_ugp_genericoptions = vB::getDatastore()->getValue('bf_ugp_genericoptions'); $usergroups = $this->fetchUsergroupList(); $bannedusergroups = array(); foreach ($usergroups as $usergroup) { if (!($usergroup['genericoptions'] & $bf_ugp_genericoptions['isnotbannedgroup'])) { $bannedusergroups[$usergroup['usergroupid']] = $usergroup; } } return $bannedusergroups; }
public function parseArticleSearch($node, $parent) { $content = $node['content']; $article = array('title' => vB_String::unHtmlSpecialChars($content['title']), 'html_title' => $content['title'], 'username' => $content['authorname'], 'description' => $content['description'], 'parenttitle' => vB_String::unHtmlSpecialChars($parent['title']), 'parentid' => $content['parentid'], 'previewtext' => $content['previewtext'], 'publishtime' => $content['publishdate'], 'replycount' => $content['textcount'], 'page_url' => vB5_Route::buildUrl($node['routeid'] . '|fullurl', $node), 'parent_url' => vB5_Route::buildUrl($parent['routeid'] . '|fullurl', $parent), 'lastposterinfo' => array('userid' => $content['lastauthorid'], 'username' => $content['lastcontentauthor']), 'avatar' => array('hascustom' => $content['avatar']['hascustom'], '0' => $content['avatar']['avatarpath'], '1' => ''), 'article' => array('contentid' => $content['nodeid'], 'nodeid' => $content['nodeid'], 'username' => $content['authorname'], 'userid' => $content['userid'], 'publishtime' => $content['publishdate'], 'title' => vB_String::unHtmlSpecialChars($content['title'])), 'categories' => array(), 'show' => array()); return $article; }
function exec_digest($type = 2) { // type = 2 : daily // type = 3 : weekly $lastdate = mktime(0, 0); // midnight today if ($type == 2) { // daily // yesterday midnight $lastdate -= 24 * 60 * 60; } else { // weekly // last week midnight $lastdate -= 7 * 24 * 60 * 60; } if (trim(vB::getDatastore()->getOption('globalignore')) != '') { $coventry = preg_split('#\\s+#s', vB::getDatastore()->getOption('globalignore'), -1, PREG_SPLIT_NO_EMPTY); } else { $coventry = array(); } require_once DIR . '/includes/class_bbcode_alt.php'; $vbulletin =& vB::get_registry(); $plaintext_parser = new vB_BbCodeParser_PlainText($vbulletin, fetch_tag_list()); vB_Mail::vbmailStart(); $bf_misc_useroptions = vB::get_datastore()->get_value('bf_misc_useroptions'); $bf_ugp_genericoptions = vB::get_datastore()->get_value('bf_ugp_genericoptions'); $bf_ugp_forumpermissions = vB::get_datastore()->get_value('bf_ugp_forumpermissions'); // we want to fetch all language records at once and using cache if possible $defaultLanguage = false; $languageIds = array(); // get new threads (Topic Subscription) $threads = vB::getDbAssertor()->getRows('getNewThreads', array('dstonoff' => $bf_misc_useroptions['dstonoff'], 'hasaccessmask' => $bf_misc_useroptions['hasaccessmask'], 'isnotbannedgroup' => $bf_ugp_genericoptions['isnotbannedgroup'], 'lastdate' => intval($lastdate))); // grab all forums / subforums for given subscription (Channel Subscription) $forums = vB::getDbAssertor()->assertQuery('getNewForums', array('dstonoff' => $bf_misc_useroptions['dstonoff'], 'hasaccessmask' => $bf_misc_useroptions['hasaccessmask'], 'type' => intval($type), 'lastdate' => intval($lastdate), 'channelcontenttype' => vB_Api::instanceInternal('contenttype')->fetchContentTypeIdFromClass('Channel'), 'isnotbannedgroup' => $bf_ugp_genericoptions['isnotbannedgroup'])); // Let's see which languageids we wanna fetch foreach ($threads as $thread) { if ($thread['languageid'] == 0) { if (!$defaultLanguage) { $defaultLanguage = intval(vB::getDatastore()->getOption('languageid')); $languageIds[] = $defaultLanguage; } } else { $languageIds[] = $thread['languageid']; } } foreach ($forums as $forum) { if ($forum['languageid'] == 0) { if (!$defaultLanguage) { $defaultLanguage = intval(vB::getDatastore()->getOption('languageid')); $languageIds[] = $defaultLanguage; } } else { $languageIds[] = $forum['languageid']; } } // fetch languages $languages = vB_Library::instance('language')->fetchLanguages($languageIds); // process threads foreach ($threads as $thread) { $postbits = ''; // Make sure user have correct email notification settings. if ($thread['emailnotification'] != $type) { continue; } if ($thread['lastauthorid'] != $thread['userid'] and in_array($thread['lastauthorid'], $coventry)) { continue; } $usercontext = vB::getUserContext($thread['userid']); if (!$usercontext->getChannelPermission('forumpermissions', 'canview', $thread['nodeid']) or !$usercontext->getChannelPermission('forumpermissions', 'canviewthreads', $thread['nodeid']) or $thread['lastauthorid'] != $thread['userid'] and !$usercontext->getChannelPermission('forumpermissions', 'canviewothers', $thread['nodeid'])) { continue; } $langInfo =& $languages[$thread['languageid']]; $userinfo = array('lang_locale' => $langInfo['locale'], 'dstonoff' => $thread['dstonoff'], 'timezoneoffset' => $thread['timezoneoffset']); $thread['lastreplydate'] = vbdate($langInfo['dateoverride'] ? $langInfo['dateoverride'] : vB::getDatastore()->getOption('dateformat'), $thread['lastcontent'], false, true, true, false, $userinfo); $thread['lastreplytime'] = vbdate($langInfo['timeoverride'] ? $langInfo['timeoverride'] : vB::getDatastore()->getOption('timeformat'), $thread['lastcontent'], false, true, true, false, $userinfo); $thread['htmltitle'] = unhtmlspecialchars($thread['htmltitle']); $thread['username'] = unhtmlspecialchars($thread['username']); $thread['postusername'] = unhtmlspecialchars($thread['authorname']); $thread['lastposter'] = unhtmlspecialchars($thread['lastcontentauthor']); $thread['newposts'] = 0; //not currently used and probably needs rethinking, but don't want to remove until this code gets rewritten //$thread['auth'] = md5($thread['userid'] . $thread['subscribediscussionid'] . $thread['secret'] . vB_Request_Web::$COOKIE_SALT); if ($thread['prefixid']) { // need prefix in correct language $phraseAux = vB_Api::instanceInternal('phrase')->fetch(array("prefix_{$thread['prefixid']}_title_plain")); $thread['prefix_plain'] = $phraseAux["prefix_{$thread['prefixid']}_title_plain"] . ' '; } else { $thread['prefix_plain'] = ''; } // Note: closure.depth = 1 on the where clause means getNewPosts only grabs replies, not comments. // get posts $posts = vB::getDbAssertor()->getRows('getNewPosts', array('threadid' => intval($thread['nodeid']), 'lastdate' => intval($lastdate))); // compile $haveothers = false; foreach ($posts as $post) { if ($post['userid'] != $thread['userid'] and in_array($post['userid'], $coventry)) { continue; } if ($post['userid'] != $thread['userid']) { $haveothers = true; } $thread['newposts']++; $post['htmltitle'] = unhtmlspecialchars($post['htmltitle']); $post['postdate'] = vbdate($langInfo['dateoverride'] ? $langInfo['dateoverride'] : vB::getDatastore()->getOption('dateformat'), $post['publishdate'], false, true, true, false, $userinfo); $post['posttime'] = vbdate($langInfo['timeoverride'] ? $langInfo['timeoverride'] : vB::getDatastore()->getOption('timeformat'), $post['publishdate'], false, true, true, false, $userinfo); $post['postusername'] = unhtmlspecialchars($post['authorname']); $plaintext_parser->set_parsing_language($thread['languageid']); $contentAPI = vB_Library_Content::getContentApi($post['contenttypeid']); $contents = $contentAPI->getContent($post['nodeid']); $post['pagetext'] = $plaintext_parser->parse($contents[$post['nodeid']]['rawtext'], $thread['parentid']); $postlink = vB5_Route::buildUrl($post['routeid'] . '|bburl', array('nodeid' => $post['nodeid'])); /*$postlink = fetch_seo_url('thread|nosession|bburl', array('threadid' => $thread['nodeid'], 'title' => htmlspecialchars_uni($thread['title']))) . "#post$post[nodeid]";*/ // Legacy Hook 'digest_thread_post' Removed // $phrases = vB_Api::instanceInternal('phrase')->fetch('digestpostbit', $thread['languageid']); $postbits .= sprintf($phrases['digestpostbit'], $post['htmltitle'], $postlink, $post['postusername'], $post['postdate'], $post['posttime'], $post['pagetext']); } // Legacy Hook 'digest_thread_process' Removed // // Don't send an update if the subscriber is the only one who posted in the thread. if ($haveothers) { // make email // magic vars used by the phrase eval $threadlink = vB5_Route::buildUrl($thread['routeid'] . '|fullurl', array('nodeid' => $thread['nodeid'])); //$threadlink = fetch_seo_url('thread|nosession|bburl', array('threadid' => $thread['threadid'], 'title' => htmlspecialchars_uni($thread['title']))); //this link probably doesn't do what the author thinks it does, need to validate. $unsubscribelink = vB5_Route::buildUrl('subscription|fullurl', array('tab' => 'subscriptions', 'userid' => $thread['userid'])); $maildata = vB_Api::instanceInternal('phrase')->fetchEmailPhrases('digestthread', array($thread['username'], $thread['prefix_plain'], $thread['htmltitle'], $thread['postusername'], $thread['newposts'], $thread['lastposter'], $threadlink, $postbits, vB::getDatastore()->getOption('bbtitle'), $unsubscribelink), array($thread['prefix_plain'], $thread['htmltitle']), $thread['languageid']); vB_Mail::vbmail($thread['email'], $maildata['subject'], $maildata['message']); } } unset($plaintext_parser); // process forums foreach ($forums as $forum) { $langInfo =& $languages[$forum['languageid']]; $userinfo = array('lang_locale' => $langInfo['locale'], 'dstonoff' => $forum['dstonoff'], 'timezoneoffset' => $forum['timezoneoffset']); $newthreadbits = ''; $newthreads = 0; $updatedthreadbits = ''; $updatedthreads = 0; $forum['username'] = unhtmlspecialchars($forum['username']); $forum['title_clean'] = unhtmlspecialchars($forum['title_clean']); //not currently used and probably needs rethinking, but don't want to remove until this code gets rewritten //$forum['auth'] = md5($forum['userid'] . $forum['subscribeforumid'] . $forum['secret'] . vB_Request_Web::$COOKIE_SALT); $threads = vB::getDbAssertor()->assertQuery('fetchForumThreads', array('forumid' => intval($forum['forumid']), 'lastdate' => intval($lastdate))); foreach ($threads as $thread) { if ($thread['postuserid'] != $forum['userid'] and in_array($thread['postuserid'], $coventry)) { continue; } // allow those without canviewthreads to subscribe/receive forum updates as they contain not post content $usercontext = vB::getUserContext($thread['userid']); if (!$usercontext->getChannelPermission('forumpermissions', 'canview', $thread['nodeid']) or $thread['lastauthorid'] != $thread['userid'] and !$usercontext->getChannelPermission('forumpermissions', 'canviewothers', $thread['nodeid'])) { continue; } $thread['forumhtmltitle'] = unhtmlspecialchars($thread['forumhtmltitle']); $thread['lastreplydate'] = vbdate($langInfo['dateoverride'] ? $langInfo['dateoverride'] : vB::getDatastore()->getOption('dateformat'), $thread['lastpost'], false, true, true, false, $userinfo); $thread['lastreplytime'] = vbdate($langInfo['timeoverride'] ? $langInfo['timeoverride'] : vB::getDatastore()->getOption('timeformat'), $thread['lastpost'], false, true, true, false, $userinfo); $thread['htmltitle'] = unhtmlspecialchars($thread['htmltitle']); $thread['postusername'] = unhtmlspecialchars($thread['postusername']); $thread['lastposter'] = unhtmlspecialchars($thread['lastposter']); if ($thread['prefixid']) { // need prefix in correct language $phraseAux = vB_Api::instanceInternal('phrase')->fetch(array("prefix_{$thread['prefixid']}_title_plain")); $thread['prefix_plain'] = $phraseAux["prefix_{$thread['prefixid']}_title_plain"] . ' '; } else { $thread['prefix_plain'] = ''; } $threadlink = vB5_Route::buildUrl($thread['routeid'] . '|fullurl', array('nodeid' => $thread['threadid'])); // Legacy Hook 'digest_forum_thread' Removed // $maildata = vB_Api::instanceInternal('phrase')->fetchEmailPhrases('digestthreadbit', array($thread['prefix_plain'], $thread['htmltitle'], $threadlink, $thread['forumhtmltitle'], $thread['postusername'], $thread['lastreplydate'], $thread['lastreplytime']), array(), $forum['languageid']); if ($thread['dateline'] > $lastdate) { // new thread $newthreads++; $newthreadbits .= $maildata['message']; } else { $updatedthreads++; $updatedthreadbits .= $maildata['message']; } } // Legacy Hook 'digest_forum_process' Removed // if (!empty($newthreads) or !empty($updatedthreadbits)) { // make email // magic vars used by the phrase eval //$forumlink = fetch_seo_url('forum|nosession|bburl', $forum); $forumlink = vB5_Route::buildUrl($forum['routeid'] . '|fullurl', array('nodeid' => $forum['forumid'])); //this link probably doesn't do what the author thinks it does. Need to validate. $unsubscribelink = vB5_Route::buildUrl('subscription|fullurl', array('tab' => 'subscriptions', 'userid' => $forum['userid'])); $maildata = vB_Api::instanceInternal('phrase')->fetchEmailPhrases('digestforum', array($forum['username'], $forum['title_clean'], $newthreads, $updatedthreads, $forumlink, $newthreadbits, $updatedthreadbits, vB::getDatastore()->getOption('bbtitle'), $unsubscribelink), array($forum['title_clean']), $forum['languageid']); vB_Mail::vbmail($forum['email'], $maildata['subject'], $maildata['message'], true); } } // ******* Social Group Digests ********** $bf_misc_socnet = vB::get_datastore()->get_value('bf_misc_socnet'); if (vB::getDatastore()->getOption('socnet') & $bf_misc_socnet['enable_groups']) { require_once DIR . '/includes/functions_socialgroup.php'; /** @todo review this part*/ /** @todo if we reenable this code, we need to prefetch language records as for threads and forums */ /* $groups = vB::getDbAssertor()->assertQuery('fetchSocialGroupDigests', array( 'dstonoff' => $bf_misc_useroptions['dstonoff'], 'hasaccessmask' => $bf_misc_useroptions['hasaccessmask'], 'languageid' => intval(vB::getDatastore()->getOption('languageid')), 'type' => $type == 2 ? 'daily' : 'weekly', 'lastdate' => intval($lastdate), 'isnotbannedgroup' => $bf_ugp_genericoptions['isnotbannedgroup'] )); foreach ($groups as $group) { $userperms = cache_permissions($group, false); if (!($userperms['forumpermissions'] & $vbulletin->bf_ugp_forumpermissions['canview']) OR !($userperms['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['canviewgroups']) ) { continue; } if ($group['options'] & $vbulletin->bf_misc_socialgroupoptions['join_to_view'] AND $vbulletin->options['sg_allow_join_to_view']) { if ($group['membertype'] != 'member' AND !($userperms['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['canalwayspostmessage']) AND !($userperms['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['canalwascreatediscussion']) ) { continue; } } $userinfo = array( 'lang_locale' => $group['lang_locale'], 'dstonoff' => $group['dstonoff'], 'timezoneoffset' => $group['timezoneoffset'], ); $new_discussion_bits = ''; $new_discussions = 0; $updated_discussion_bits = ''; $updated_discussions = 0; $group['username'] = unhtmlspecialchars($group['username']); $group['name'] = unhtmlspecialchars($group['name']); $discussions = vB::getDbAssertor()->assertQuery('fetchGroupDiscussions', array( 'groupid' => $group['groupid'], 'lastdate' => intval($lastdate) )); foreach ($discussions as $discussion) { $discussion['lastreplydate'] = vbdate($group['lang_dateoverride'] ? $group['lang_dateoverride'] : $vbulletin->options['default_dateformat'], $discussion['lastpost'], false, true, true, false, $userinfo); $discussion['lastreplytime'] = vbdate($group['lang_timeoverride'] ? $group['lang_timeoverride'] : $vbulletin->options['default_timeformat'], $discussion['lastpost'], false, true, true, false, $userinfo); $discussion['title'] = unhtmlspecialchars($discussion['title']); $discussion['postusername'] = unhtmlspecialchars($discussion['postusername']); $discussion['lastposter'] = unhtmlspecialchars($discussion['lastposter']); // Legacy Hook 'digest_group_discussion' Removed // //magic variables that will be picked up by the phrase eval $discussionlink = fetch_seo_url('groupdiscussion', $discussion); $maildata = vB_Api::instanceInternal('phrase') ->fetchEmailPhrases('digestgroupbit', array($discussion['htmltitle'], $discussionlink, $group['name'], $discussion['postusername'], $discussion['lastreplydate'], $discussion['lastreplytime']), array(), $group['languageid']); if ($discussion['dateline'] > $lastdate) { // new discussion $new_discussions++; $new_discussion_bits .= $maildata['message']; } else { $updated_discussions++; $updated_discussion_bits .= $maildata['message']; } } // Legacy Hook 'digest_group_process' Removed // if (!empty($new_discussion_bits) OR !empty($updated_discussion_bits)) { //magic variables that will be picked up by the phrase eval $grouplink = fetch_seo_url('group|nosession|bburl', $group); // make email $maildata = vB_Api::instanceInternal('phrase') ->fetchEmailPhrases('digestgroup', array($group['username'], $group['name'], $new_discussions, $updated_discussions, $grouplink, $new_discussion_bits, $updated_discussion_bits, $vbulletin->options['bbtitle']), array($group['name']), $group['languageid']); vB_Mail::vbmail($group['email'], $maildata['subject'], $maildata['message']); } } */ } vB_Mail::vbmailEnd(); }
/** * Builds the applicable notification HTML and count * * @return array [bits] => HTML, [total] => formatted count */ protected function build_notifications() { global $vbulletin, $vbphrase, $show; if (!$vbulletin->userinfo['userid']) { return false; } $notifications = array(); if ($vbulletin->options['enablepms'] and $vbulletin->userinfo['userid'] and ($vbulletin->userinfo['pmunread'] or $vbulletin->userinfo['receivepm'] and $vbulletin->userinfo['permissions']['pmquota'])) { $notifications['pmunread'] = array('phrase' => $vbphrase['unread_private_messages'], 'link' => 'private.php' . vB::getCurrentSession()->get('sessionurl_q'), 'order' => 10); } if ($vbulletin->userinfo['vm_enable'] and $vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_visitor_messaging'] and $vbulletin->userinfo['permissions']['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canviewmembers']) { $notifications['vmunreadcount'] = array('phrase' => $vbphrase['unread_profile_visitor_messages'], 'link' => vB5_Route::buildUrl('profile', $vbulletin->userinfo), 'order' => 20); if ($vbulletin->userinfo['permissions']['visitormessagepermissions'] & $vbulletin->bf_ugp_visitormessagepermissions['canmanageownprofile']) { $notifications['vmmoderatedcount'] = array('phrase' => $vbphrase['profile_visitor_messages_awaiting_approval'], 'link' => vB5_Route::buildUrl('profile', $vbulletin->userinfo), 'order' => 30); } } // check for incoming friend requests if user has permission to use the friends system if ($vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_friends'] and $vbulletin->userinfo['permissions']['genericpermissions2'] & $vbulletin->bf_ugp_genericpermissions2['canusefriends']) { $notifications['friendreqcount'] = array('phrase' => $vbphrase['incoming_friend_requests'], 'link' => 'profile.php?' . vB::getCurrentSession()->get('sessionurl') . 'do=buddylist#irc', 'order' => 40); } // social group invitations and join requests if ($vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_groups']) { // check for requests to join your own social groups, if user has permission to create groups if ($vbulletin->userinfo['permissions']['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['cancreategroups']) { $notifications['socgroupreqcount'] = array('phrase' => $vbphrase['requests_to_join_your_social_groups'], 'link' => fetch_seo_url('grouphome', array(), array('do' => 'requests')), 'order' => 50); } // check for invitations to join social groups, if user has permission to join groups if ($vbulletin->userinfo['permissions']['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['canjoingroups']) { $notifications['socgroupinvitecount'] = array('phrase' => $vbphrase['invitations_to_join_social_groups'], 'link' => fetch_seo_url('grouphome', array(), array('do' => 'invitations')), 'order' => 60); } } // picture comment notifications if ($vbulletin->options['pc_enabled'] and ($vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_albums'] and $vbulletin->userinfo['permissions']['genericpermissions'] & $vbulletin->bf_ugp_genericpermissions['canviewmembers'] and $vbulletin->userinfo['permissions']['albumpermissions'] & $vbulletin->bf_ugp_albumpermissions['canviewalbum'] and $vbulletin->userinfo['permissions']['albumpermissions'] & $vbulletin->bf_ugp_albumpermissions['canalbum'] or $vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_groups'] and $vbulletin->userinfo['permissions']['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['canviewgroups'])) { $notifications['pcunreadcount'] = array('phrase' => $vbphrase['unread_picture_comments'], 'link' => 'album.php?' . vB::getCurrentSession()->get('sessionurl') . 'do=unread', 'order' => 70); if ($vbulletin->userinfo['permissions']['albumpermissions'] & $vbulletin->bf_ugp_albumpermissions['canmanagepiccomment']) { $notifications['pcmoderatedcount'] = array('phrase' => $vbphrase['picture_comments_awaiting_approval'], 'link' => 'album.php?' . vB::getCurrentSession()->get('sessionurl') . 'do=moderated', 'order' => 80); } } if ($vbulletin->options['socnet'] & $vbulletin->bf_misc_socnet['enable_groups'] and $vbulletin->options['socnet_groups_msg_enabled'] and $vbulletin->userinfo['permissions']['socialgrouppermissions'] & $vbulletin->bf_ugp_socialgrouppermissions['canmanageowngroups']) { $notifications['gmmoderatedcount'] = array('phrase' => $vbphrase['group_messages_awaiting_approval'], 'link' => fetch_seo_url('grouphome', array(), array('do' => 'moderatedgms')), 'order' => 90); } // Legacy Hook 'notifications_list' Removed // $notifications_order = array(); foreach ($notifications as $userfield => $notification) { $notifications_order["{$notification['order']}"]["{$userfield}"] = $userfield; } ksort($notifications_order); $notifications_total = 0; $notifications_menubits = ''; foreach ($notifications_order as $notification_order => $userfields) { ksort($notifications_order["{$notification_order}"]); foreach ($userfields as $userfield) { $notification = $notifications["{$userfield}"]; if (defined("VB_API") and VB_API === true) { $notification['name'] = $userfield; } if ($vbulletin->userinfo["{$userfield}"] > 0) { $show['notifications'] = true; $notifications_total += $vbulletin->userinfo["{$userfield}"]; $notification['total'] = vb_number_format($vbulletin->userinfo["{$userfield}"]); $templater = vB_Template::create('navbar_notifications_menubit'); $templater->register('notification', $notification); $templater->register('notificationid', $userfield); $notifications_menubits .= $templater->render(); } } } if (!$notifications_total) { return false; } return array('bits' => $notifications_menubits, 'total' => vb_number_format($notifications_total)); }
/** * @see vB_Notification::fetchPhraseArray() */ public static function fetchPhraseArray($notificationData) { $nodelink = vB5_Route::buildUrl('node|fullurl', array('nodeid' => $notificationData['sentbynodeid'])); if (empty($notificationData['sender']) or is_null($notificationData['sender_username'])) { $phraseTitle = 'guest_quoted_you_in_post'; $phraseData = array($nodelink, $notificationData['aboutstartertitle']); } else { $userid = $notificationData['sender']; $username = $notificationData['sender_username']; $userInfo = array('userid' => $userid, 'username' => $username); try { $userProfileUrl = vB5_Route::buildUrl('profile|fullurl', $userInfo); } catch (Exception $e) { $userProfileUrl = "#"; } $phraseTitle = 'x_quoted_you_in_post'; $phraseData = array($userProfileUrl, $username, $nodelink, $notificationData['aboutstartertitle']); } return array($phraseTitle, $phraseData); }
/** Responds to a request to create a new user. * **/ public function actionRegistration() { //We need at least a username, email, and password. if (empty($_REQUEST['username']) or empty($_REQUEST['password']) or empty($_REQUEST['email'])) { $this->sendAsJson(array('error' => 'insufficient data')); return; } $username = trim($_REQUEST['username']); $password = trim($_REQUEST['password']); $postdata = array('username' => $username, 'email' => $_REQUEST['email']); if (isset($_REQUEST['month']) and isset($_REQUEST['day']) and !empty($_REQUEST['year'])) { $postdata['birthday'] = $_REQUEST['year'] . '-' . str_pad($_REQUEST['month'], 2, '0', STR_PAD_LEFT) . '-' . str_pad($_REQUEST['day'], 2, '0', STR_PAD_LEFT); } if (!empty($_REQUEST['guardian'])) { $postdata['parentemail'] = $_REQUEST['guardian']; } $vboptions = vB5_Template_Options::instance()->getOptions(); $vboptions = $vboptions['options']; // Coppa cookie check $coppaage = vB5_Cookie::get('coppaage', vB5_Cookie::TYPE_STRING); if ($vboptions['usecoppa'] and $vboptions['checkcoppa']) { if ($coppaage) { $dob = explode('-', $coppaage); $month = $dob[0]; $day = $dob[1]; $year = $dob[2]; $postdata['birthday'] = $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT) . '-' . str_pad($day, 2, '0', STR_PAD_LEFT); } else { vB5_Cookie::set('coppaage', $_REQUEST['month'] . '-' . $_REQUEST['day'] . '-' . $_REQUEST['year'], 365, 0); } } // Fill in ReCaptcha data $recaptchaData = array(); if (!empty($_REQUEST['recaptcha_challenge_field'])) { $recaptchaData['recaptcha_challenge_field'] = $_REQUEST['recaptcha_challenge_field']; } if (!empty($_REQUEST['recaptcha_response_field'])) { $recaptchaData['recaptcha_response_field'] = $_REQUEST['recaptcha_response_field']; } if (!empty($recaptchaData)) { $_REQUEST['humanverify'] = $recaptchaData + (isset($_REQUEST['humanverify']) ? (array) $_REQUEST['humanverify'] : array()); } $api = Api_InterfaceAbstract::instance(); $data = array('userid' => 0, 'password' => $password, 'user' => $postdata, array(), array(), 'userfield' => !empty($_REQUEST['userfield']) ? $_REQUEST['userfield'] : false, array(), isset($_REQUEST['humanverify']) ? $_REQUEST['humanverify'] : '', array('registration' => true)); // add facebook data if ($api->callApi('facebook', 'isFacebookEnabled') && $api->callApi('facebook', 'userIsLoggedIn')) { $fbUserInfo = $api->callApi('facebook', 'getFbUserInfo'); $data['user']['fbuserid'] = $fbUserInfo['id']; $data['user']['fbname'] = $fbUserInfo['name']; $data['user']['timezoneoffset'] = $fbUserInfo['timezone']; $data['user']['fbjoindate'] = time(); $fb_profilefield_info = $this->getFacebookProfileinfo($fbUserInfo); if (!empty($fb_profilefield_info['birthday']) and empty($data['user']['birthday'])) { $data['user']['birthday'] = $fb_profilefield_info['birthday']; } if (empty($data['userfield'])) { $data['userfield'] = array(); } if ($vboptions['fb_userfield_biography']) { $data['userfield'] += array($vboptions['fb_userfield_biography'] => $fb_profilefield_info['biography']); } if ($vboptions['fb_userfield_location']) { $data['userfield'] += array($vboptions['fb_userfield_location'] => $fb_profilefield_info['location']); } if ($vboptions['fb_userfield_occupation']) { $data['userfield'] += array($vboptions['fb_userfield_occupation'] => $fb_profilefield_info['occupation']); } } // save data $response = $api->callApi('user', 'save', $data); if (!empty($response) and (!is_array($response) or !isset($response['errors']))) { // try to login $loginInfo = $api->callApi('user', 'login', array($username, $password, '', '', '')); if (!isset($loginInfo['errors']) or empty($loginInfo['errors'])) { // browser session expiration vB5_Cookie::set('sessionhash', $loginInfo['sessionhash'], 0, true); vB5_Cookie::set('password', $loginInfo['password'], 0); vB5_Cookie::set('userid', $loginInfo['userid'], 0); $urlPath = ''; if (!empty($_POST['urlpath'])) { $urlPath = base64_decode(trim($_POST['urlpath']), true); } if (!$urlPath or strpos($urlPath, '/auth/') !== false or strpos($urlPath, '/register') !== false or !vB5_Template_Runtime::allowRedirectToUrl($urlPath)) { $urlPath = vB5_Template_Options::instance()->get('options.frontendurl'); } $response = array('urlPath' => $urlPath); } else { if (!empty($loginInfo['errors'])) { $response = array('errors' => $loginInfo['errors']); } } if ($api->callApi('user', 'usecoppa')) { $response['usecoppa'] = true; $response['urlPath'] = vB5_Route::buildUrl('coppa-form|bburl'); } else { if ($vboptions['verifyemail']) { $response['msg'] = 'registeremail'; $response['msg_params'] = array(vB5_String::htmlSpecialCharsUni($postdata['username']), $postdata['email'], vB5_Template_Options::instance()->get('options.frontendurl')); } else { if ($vboptions['moderatenewmembers']) { $response['msg'] = 'moderateuser'; $response['msg_params'] = array(vB5_String::htmlSpecialCharsUni($postdata['username']), vB5_Template_Options::instance()->get('options.frontendurl')); } else { $frontendurl = vB5_Template_Options::instance()->get('options.frontendurl'); $routeProfile = $api->callApi('route', 'getUrl', array('route' => 'profile', 'data' => array('userid' => $loginInfo['userid']), array())); $routeuserSettings = $api->callApi('route', 'getUrl', array('route' => 'settings', 'data' => array('tab' => 'profile'), array())); $routeAccount = $api->callApi('route', 'getUrl', array('route' => 'settings', 'data' => array('tab' => 'account'), array())); $response['msg'] = 'registration_complete'; $response['msg_params'] = array(vB5_String::htmlSpecialCharsUni($postdata['username']), $frontendurl . $routeProfile, $frontendurl . $routeAccount, $frontendurl . $routeuserSettings, $frontendurl); } } } } $this->sendAsJson(array('response' => $response)); }
/** * Initializes an API client * * @param int $api_c API Client ID * @param array $apiclientdata 'clientname', 'clientversion', 'platformname', 'platformversion', 'uniqueid' * * @throws vB_Exception_Api Throws 'apiclientinfomissing' if any of clientname, clientversion, platformname, platformversion, or uniqueid are missing. * * @return array Api information, format: * array( * apiversion => string * apiaccesstoken => string * bbtitle => string * bburl => string * bbactive => int * bbclosedreason => string (only set if bbactive = 0) * forumhome => string * vbulletinversion => string * contenttypes => array( * content type class => content type id * [...] * ) * features => array( * blogenabled => 1 * cmsenabled => 0 * pmsenabled => int * searchesenabled => tin * groupsenabled => 1 * albumsenabled => 0 * multitypesearch => 1 * visitor_messagingenabled => 1 * taggingenabled => int * visitor_trackingenabled => 0 * paidsubs => int * friendsenabled => 0 * activitystream => 1 * ) * permissions => empty array * show => array( * registerbutton => 1 * ) * apiclientid => int * secret => string (only if API Client ID was specified in the call) * ) */ public function init($clientname, $clientversion, $platformname, $platformversion, $uniqueid, $api_c = 0) { $clientname = strip_tags($clientname); $clientversion = strip_tags($clientversion); $platformname = strip_tags($platformname); $platformversion = strip_tags($platformversion); $uniqueid = strip_tags($uniqueid); $api_c = intval($api_c); $oldclientid = $api_c; if (!$api_c) { // The client doesn't have an ID yet. So we need to generate a new one. // All params are required. // uniqueid is the best to be a permanent unique id such as hardware ID (CPU ID, // Harddisk ID or Mobile IMIE). Some client can not get a such a uniqueid, // so it needs to generate an unique ID and save it in its local storage. If it // requires the client ID and Secret again, pass the same unique ID. if (!$clientname or !$clientversion or !$platformname or !$platformversion or !$uniqueid) { throw new vB_Exception_Api('apiclientinfomissing'); } // Gererate clienthash. $clienthash = md5($clientname . $platformname . $uniqueid); // Generate a new secret $secret = fetch_random_password(32); // If the same clienthash exists, return secret back to the client. $client = $this->dbassertor->getRow('apiclient', array('clienthash' => $clienthash)); $api_c = $client['apiclientid']; if ($api_c) { // Update secret // Also remove userid so it will logout previous loggedin and remembered user. (VBM-553) $this->dbassertor->update('apiclient', array('secret' => $secret, 'apiaccesstoken' => vB::getCurrentSession()->get('apiaccesstoken'), 'lastactivity' => vB::getRequest()->getTimeNow(), 'clientversion' => $clientversion, 'platformversion' => $platformversion, 'userid' => 0), array('apiclientid' => $api_c)); } else { $api_c = $this->dbassertor->insert('apiclient', array('secret' => $secret, 'clienthash' => $clienthash, 'clientname' => $clientname, 'clientversion' => $clientversion, 'platformname' => $platformname, 'platformversion' => $platformversion, 'initialipaddress' => vB::getRequest()->getAltIp(), 'apiaccesstoken' => vB::getCurrentSession()->get('apiaccesstoken'), 'dateline' => vB::getRequest()->getTimeNow(), 'lastactivity' => vB::getRequest()->getTimeNow())); if (is_array($api_c)) { $api_c = array_pop($api_c); } $api_c = (int) $api_c; } // Set session client ID vB::getCurrentSession()->set('apiclientid', $api_c); } else { // api_c and api_sig are verified in init.php so we don't need to verify here again. $api_c = intval($api_c); // Update lastactivity $this->dbassertor->update('apiclient', array('lastactivity' => vB::getRequest()->getTimeNow()), array('apiclientid' => $api_c)); } $contenttypescache = vB_Types::instance()->getContentTypes(); $contenttypes = array(); foreach ($contenttypescache as $contenttype) { $contenttypes[$contenttype['class']] = $contenttype['id']; } $products = vB::getDatastore()->getValue('products'); $vboptions = vB::getDatastore()->getValue('options'); $userinfo = vB::getCurrentSession()->fetch_userinfo(); // Check the status of CMS and Blog $blogenabled = true; $cmsenabled = false; try { vB_Api::instanceInternal('paidsubscription')->checkStatus(); $paidsubs = 1; } catch (Exception $e) { $paidsubs = 0; } $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); $forumhomeUrl = vB5_Route::buildUrl($forumHome['routeid'] . '|fullurl'); $data = array('apiversion' => VB_API_VERSION, 'apiaccesstoken' => vB::getCurrentSession()->get('apiaccesstoken'), 'bbtitle' => $vboptions['bbtitle'], 'bburl' => $vboptions['bburl'], 'bbactive' => $vboptions['bbactive'], 'forumhome' => $forumhomeUrl, 'vbulletinversion' => $vboptions['templateversion'], 'contenttypes' => $contenttypes, 'features' => array('blogenabled' => 1, 'cmsenabled' => 0, 'pmsenabled' => $vboptions['enablepms'] ? 1 : 0, 'searchesenabled' => $vboptions['enablesearches'] ? 1 : 0, 'groupsenabled' => 1, 'albumsenabled' => 0, 'multitypesearch' => 1, 'visitor_messagingenabled' => 1, 'taggingenabled' => $vboptions['threadtagging'] ? 1 : 0, 'visitor_trackingenabled' => 0, 'paidsubs' => $paidsubs, 'friendsenabled' => 0, 'activitystream' => 1), 'permissions' => array(), 'show' => array('registerbutton' => 1)); if (!$vboptions['bbactive']) { $data['bbclosedreason'] = $vboptions['bbclosedreason']; } $data['apiclientid'] = $api_c; if (!$oldclientid) { $data['secret'] = $secret; } return $data; }
/** * @see vB_Notification::fetchPhraseArray() */ public static function fetchPhraseArray($notificationData) { try { $vmlink = vB5_Route::buildUrl('visitormessage|fullurl', array('nodeid' => $notificationData['sentbynodeid'])); } catch (Exception $e) { $vmlink = '#'; } $phraseTitle = "missing phrase for " . __CLASS__; $phraseData = array(); if (empty($notificationData['sender']) or is_null($notificationData['sender_username'])) { $phraseTitle = 'guest_posted_visitormessage_url'; $phraseData = array($vmlink); } else { $userid = $notificationData['sender']; $username = $notificationData['sender_username']; $userInfo = array('userid' => $userid, 'username' => $username); try { $userProfileUrl = vB5_Route::buildUrl('profile|fullurl', $userInfo); } catch (Exception $e) { $userProfileUrl = "#"; } $phraseTitle = 'x_posted_visitormessage_url'; $phraseData = array($username, $userProfileUrl, $vmlink); } return array($phraseTitle, $phraseData); }
?> "; } else { window.location = "mailto:" + value; } } </script> <?php print_form_header('usertools', ''); print_table_header(construct_phrase($vbphrase['users_with_x_private_messages_stored'], $vbulletin->GPC['pms']), 3); print_cells_row(array($vbphrase['username'], $vbphrase['last_activity'], $vbphrase['options']), 1); foreach ($users as $user) { $cell = array(); $cell[] = "<a href=\"" . vB5_Route::buildUrl('profile|bburl', $user) . "\" target=\"_blank\">{$user['username']}</a>"; $cell[] = vbdate($vbulletin->options['dateformat'] . ', ' . $vbulletin->options['timeformat'], $user['lastactivity']); $cell[] = "\n\t\t<select name=\"u{$user['userid']}\" onchange=\"js_pm_jump({$user['userid']}, '{$user['username']}');\" tabindex=\"1\" class=\"bginput\">\n\t\t\t<option value=\"pmstats\">" . $vbphrase['view_private_message_statistics'] . "</option>\n\t\t\t<option value=\"profile\">" . $vbphrase['edit_user'] . "</option>\n\t\t\t" . (!empty($user['email']) ? "<option value=\"{$user['email']}\">" . $vbphrase['send_email_to_user'] . "</option>" : "") . "\n\t\t\t<option value=\"pmuser\">" . $vbphrase['send_private_message_to_user'] . "</option>\n\t\t\t<option value=\"delete\">" . construct_phrase($vbphrase['delete_all_users_private_messages']) . "</option>\n\t\t</select><input type=\"button\" class=\"button\" value=\"{$vbphrase['go']}\" onclick=\"js_pm_jump({$user['userid']}, '{$user['username']}');\" tabindex=\"1\" />\n\t"; print_cells_row($cell); } print_table_footer(); } // ############################# start do ips ######################### if ($_REQUEST['do'] == 'doips') { if (function_exists('set_time_limit') and !SAFEMODE) { @set_time_limit(0); } $vbulletin->input->clean_array_gpc('r', array('depth' => vB_Cleaner::TYPE_INT, 'username' => vB_Cleaner::TYPE_STR, 'ipaddress' => vB_Cleaner::TYPE_NOHTML)); if (($vbulletin->GPC['username'] or $vbulletin->GPC['userid'] or $vbulletin->GPC['ipaddress']) and $_POST['do'] != 'doips') { // we're doing a search of some type, that's not submitted via post, // so we need to verify the CP sessionhash
public function getBreadcrumbs() { $breadcrumbs = array(array('phrase' => 'inbox', 'url' => vB5_Route::buildUrl('privatemessage')), array('phrase' => 'notifications', 'url' => '')); return $breadcrumbs; }
} } } else { // something went horribly wrong, get $apiobj->error if ($apiobj->type == 3) { // type = 3 means we received a valid response but we need to ignore it .. thanks Google, obtuse! if ($apiobj->display_feedback) { $vbulletin->url = $vbulletin->options['bburl'] . '/payments.php'; eval(print_standard_redirect('payment_complete', true, true)); } } else { $trans = array('state' => 0, 'dateline' => TIMENOW, 'paymentapiid' => $api['paymentapiid'], 'request' => serialize(array('vb_error_code' => $apiobj->error_code, 'GET' => serialize($_GET), 'POST' => serialize($_POST)))); vB::getDbAssertor()->insert('vBForum:paymenttransaction', $trans); if ($apiobj->display_feedback and !empty($apiobj->error)) { //die("<p>{$apiobj->error}</p>"); // we dont load header / footer, so just show the LITE template define('VB_ERROR_LITE', true); standard_error($apiobj->error); } } } } } else { exec_header_redirect(vB5_Route::buildUrl('home|fullurl')); } /*=========================================================================*\ || ####################################################################### || # Downloaded: 15:45, Tue Sep 8th 2015 || # CVS: $RCSfile$ - $Revision: 83432 $ || ####################################################################### \*=========================================================================*/
$cell[] = '<span class="smallfont">' . vbdate($vbulletin->options['logdateformat'], $infraction['expires']) . '</span>'; } break; case 1: $cell[] = $vbphrase['expired_ginfraction']; break; case 2: $cell[] = $vbphrase['reversed_ginfraction']; break; } } $postlink = ''; if (!empty($infraction['infractednodeid']) and !$infraction['postdeleted']) { $infractedNode = vB_Api::instanceInternal('node')->getNodeFullContent($infraction['infractednodeid']); $infractedNode = $infractedNode[$infraction['infractednodeid']]; $postlink = vB5_Route::buildUrl($infractedNode['routeid'] . '|fullurl', array('nodeid' => $infractedNode['nodeid'], 'title' => $infractedNode['title']), array('p' => $infractedNode['nodeid'])) . '#post' . $infractedNode['nodeid']; } $cell[] = $postlink ? construct_link_code(htmlspecialchars_uni($vbphrase['post']), $postlink, true, '', true) : ' '; $cell[] = ($infraction['action'] != 2 ? construct_link_code($vbphrase['reverse_ginfraction'], "admininfraction.php?" . vB::getCurrentSession()->get('sessionurl') . "do=reverse&nodeid={$infraction['nodeid']}" . $args . $vbulletin->GPC['orderby'], false, '', true) : '') . ' ' . construct_link_code($vbphrase['infraction_view'], "admininfraction.php?" . vB::getCurrentSession()->get('sessionurl') . "do=details&nodeid={$infraction['nodeid']}", false, '', true) . ' ' . construct_link_code($vbphrase['delete'], "admininfraction.php?" . vB::getCurrentSession()->get('sessionurl') . "do=deleteinfraction&nodeid={$infraction['nodeid']}" . $args . $vbulletin->GPC['orderby'], false, '', true); print_cells_row($cell); } print_table_footer(8, "{$firstpage} {$prevpage} {$nextpage} {$lastpage}"); } else { print_stop_message2('no_matches_found_gcpuser', NULL, array(), ''); } } // ###################### Start add ####################### if ($_REQUEST['do'] == 'editgroup') { print_form_header('admininfraction', 'updategroup'); if (!empty($vbulletin->GPC['infractiongroupid'])) { $infraction = vB::getDbAssertor()->getRow('infractiongroup', array('infractiongroupid' => $vbulletin->GPC['infractiongroupid']));
/** * Adds breadcrumb entries for all the parents of the passed node id. * This is inclusive of the passed node id, but excludes "home". * Modifies $this->breadcrumbs * * @param int Node ID * @param bool If true, only add the top-most parent after home, and ignore the rest. */ protected function addParentNodeBreadcrumbs($nodeId, $onlyAddTopParent = false) { try { // obtain crumbs $nodeLibrary = vB_Library::instance('node'); $nodeParents = $nodeLibrary->getNodeParents($nodeId); $nodeParentsReversed = array_reverse($nodeParents); $parentsInfo = $nodeLibrary->getNodes($nodeParentsReversed); $routeIds = array(); foreach ($nodeParentsReversed as $parentId) { if ($parentId != 1) { $routeIds[] = $parentsInfo[$parentId]['routeid']; if ($onlyAddTopParent) { break; } } } vB5_Route::preloadRoutes($routeIds); foreach ($nodeParentsReversed as $parentId) { if ($parentId != 1) { $this->breadcrumbs[] = array('title' => $parentsInfo[$parentId]['title'], 'url' => vB5_Route::buildUrl($parentsInfo[$parentId]['routeid'])); if ($onlyAddTopParent) { break; } } } } catch (vB_Exception $e) { // if we don't have permissions to view the channel, then skip this } }
/** * Handles a [node] tag. Creates a link to a node. * * @param string If tag has option, the displayable name. Else, the threadid. * @param string If tag has option, the threadid. * * @return string HTML representation of the tag. */ protected function handle_bbcode_node($text, $nodeId) { $nodeId = intval($nodeId); if (empty($nodeId)) { // no option -- use param $nodeId = intval($text); unset($text); } // fetch URL $nodeInfo = array('nodeid' => $nodeId); $url = vB5_Route::buildUrl('node|fullurl', $nodeInfo); if (!isset($text)) { $text = $url; } // standard URL hyperlink $value = "<a href=\"{$url}\" target=\"_blank\">{$text}</a>"; return $value; }
public function getBreadcrumbs() { $breadcrumbs = array(array('phrase' => 'inbox', 'url' => vB5_Route::buildUrl('privatemessage')), array('phrase' => 'subscriptions_channels', 'url' => '')); return $breadcrumbs; }
$admindm->set('notes', $vbulletin->GPC['notes']); $admindm->save(); unset($admindm); $vbulletin->userinfo['notes'] = htmlspecialchars_uni($vbulletin->GPC['notes']); $_REQUEST['do'] = 'home'; } // ############################################################################# // ################################# HEADER FRAME ############################## // ############################################################################# $versionhost = vB::getRequest()->getVbUrlScheme() . '://version.vbulletin.com'; if ($_REQUEST['do'] == 'head') { ignore_user_abort(true); define('IS_NAV_PANEL', true); print_cp_header('', ''); $forumHome = vB_Library::instance('content_channel')->getForumHomeChannel(); $forumhomelink = vB5_Route::buildUrl($forumHome['routeid'] . '|fullurl'); ?> <div id="acp-head-wrapper"> <ul id="acp-top-links"> <li id="acp-top-link-acp" class="left"><div><span class="icon"></span><?php echo $vbphrase['admin_cp']; ?> </div></li> <li id="acp-top-link-site" class="left"><a href="../" target="_blank"><?php echo $vbphrase['site_home_page']; ?> </a></li> <li class="left divider"></li> <li id="acp-top-link-logout" class="right rightmost"><a href="index.php?<?php echo vB::getCurrentSession()->get('sessionurl'); ?>