public function execute(array $deferred, array $data, $targetRunTime, &$status)
 {
     $data = array_merge(array('position' => 0, 'queryKeys' => array('xengallery_media_drop', 'xengallery_media_add', 'xengallery_album', 'xengallery_comment', 'xengallery_user_tag', 'xf_user')), $data);
     if (!$data['queryKeys']) {
         return true;
     }
     $s = microtime(true);
     $db = XenForo_Application::getDb();
     $status = sprintf('%s... %s %s', 'Adding', 'XFMG Table Indexes', str_repeat(' . ', $data['position']));
     foreach ($data['queryKeys'] as $key => $name) {
         $data['position']++;
         $query = $this->_getQueryToExecute($name);
         if (!$query) {
             continue;
         }
         try {
             $db->query($query);
             unset($data['queryKeys'][$key]);
         } catch (Zend_Db_Exception $e) {
             if ($name != 'xengallery_media_drop') {
                 XenForo_Error::logException($e, false, "XenForo Media Gallery: Error adding index(es) ({$name}): ");
             }
             unset($data['queryKeys'][$key]);
             continue;
         }
         if ($targetRunTime && microtime(true) - $s > $targetRunTime) {
             break;
         }
     }
     return $data;
 }
Example #2
0
 /**
  * Determines if CAPTCHA is valid (passed).
  *
  * @see XenForo_Captcha_Abstract::isValid()
  */
 public function isValid(array $input)
 {
     if (!$this->_cKey) {
         return true;
         // if not configured, always pass
     }
     if (empty($input['adcopy_challenge']) || empty($input['adcopy_response'])) {
         return false;
     }
     try {
         $client = XenForo_Helper_Http::getClient('http://verify.solvemedia.com/papi/verify');
         $client->setParameterPost(array('privatekey' => $this->_vKey, 'challenge' => $input['adcopy_challenge'], 'response' => $input['adcopy_response'], 'remoteip' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''));
         $contents = trim($client->request('POST')->getBody());
         $parts = explode("\n", $contents, 3);
         $result = trim($parts[0]);
         $error = isset($parts[1]) ? trim($parts[1]) : null;
         if ($result == 'true') {
             return true;
         }
         switch ($error) {
             case 'wrong answer':
             case 'invalid remoteip':
                 // generally end user mistakes
                 return false;
             default:
                 // this is likely a configuration error, log and let it through
                 XenForo_Error::logError("Solve Media CAPTCHA error: {$error}");
                 return true;
         }
     } catch (Zend_Http_Client_Adapter_Exception $e) {
         // this is an exception with the underlying request, so let it go through
         XenForo_Error::logException($e, false, "Solve Media connection error: ");
         return true;
     }
 }
Example #3
0
 public function runMailQueue($targetRunTime)
 {
     $s = microtime(true);
     $transport = XenForo_Mail::getTransport();
     $db = $this->_getDb();
     do {
         $queue = $this->getMailQueue($targetRunTime ? 20 : 0);
         foreach ($queue as $id => $record) {
             if (!$db->delete('xf_mail_queue', 'mail_queue_id = ' . $db->quote($id))) {
                 // already been deleted - run elsewhere
                 continue;
             }
             $mailObj = @unserialize($record['mail_data']);
             if (!$mailObj instanceof Zend_Mail) {
                 continue;
             }
             $thisTransport = XenForo_Mail::getFinalTransportForMail($mailObj, $transport);
             try {
                 $mailObj->send($thisTransport);
             } catch (Exception $e) {
                 $toEmails = implode(', ', $mailObj->getRecipients());
                 XenForo_Error::logException($e, false, "Email to {$toEmails} failed: ");
                 // pipe may be messed up now, so let's be sure to get another one
                 unset($transport);
                 $transport = XenForo_Mail::getTransport();
             }
             if ($targetRunTime && microtime(true) - $s > $targetRunTime) {
                 $queue = false;
                 break;
             }
         }
     } while ($queue);
     return $this->hasMailQueue();
 }
Example #4
0
 public function actionDiscordLink()
 {
     $this->_assertPostOnly();
     $visitor = XenForo_Visitor::getInstance();
     if (!$visitor->hasPermission('general', 'linkDiscord')) {
         return $this->responseNoPermission();
     }
     $tokenModel = $this->_getTokenmodel();
     $generate = $this->_input->filterSingle('create', XenForo_Input::STRING, array('default' => ''));
     if (strlen($generate)) {
         $dw = XenForo_DataWriter::create('DiscordAuth_DataWriter_Token');
         $existing = $tokenModel->getTokenByUserId($visitor['user_id']);
         if ($existing === false || !$existing['valid']) {
             if ($existing !== false) {
                 $dw->setExistingData($existing, true);
             }
             try {
                 $dw->set('user_id', $visitor['user_id']);
                 $dw->set('token', self::generateToken());
                 $dw->save();
                 // self::generateToken may throw Exception
             } catch (Exception $e) {
                 XenForo_Error::logException($e, false);
             }
         }
     }
     $unlink = $this->_input->filterSingle('unlink', XenForo_Input::STRING, array('default' => ''));
     if (strlen($unlink)) {
         $dw = XenForo_DataWriter::create('XenForo_DataWriter_User');
         $dw->setExistingData($visitor['user_id']);
         $dw->set('da_discord_id', null);
         $dw->save();
     }
     return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $this->getDynamicRedirect(XenForo_Link::buildPublicLink('account/discord')));
 }
 public function processUsers(XenForo_DataWriter_DiscussionMessage_Post $dw)
 {
     if ($this->_controller->getInput()->filterSingle('ImageRestrictionDataIsComing', XenForo_Input::UINT)) {
         $usernames = $this->_controller->getInput()->filterSingle('ImageRestrictionUsers', XenForo_Input::STRING, array('array' => true));
         foreach (array_keys($usernames) as $i) {
             if (empty($usernames[$i])) {
                 unset($usernames[$i]);
             }
         }
         if (!empty($usernames)) {
             $userModel = $this->_controller->getModelFromCache('XenForo_Model_User');
             $fetchOptions = array();
             $invalidNames = array();
             $users = $userModel->getUsersByNames($usernames, $fetchOptions, $invalidNames);
             try {
                 if (!empty($invalidNames)) {
                     throw new XenForo_Exception(new XenForo_Phrase('th_imagerestriction_users_not_found_x_imagerestriction', array('users' => implode(', ', $invalidNames))), true);
                 }
             } catch (Exception $e) {
                 XenForo_Error::logException($e);
             }
             $dw->setImageRestrictionUsers($users);
         } else {
             $dw->setImageRestrictionUsers(array());
         }
     }
 }
 /**
  * Determines if CAPTCHA is valid (passed).
  *
  * @see XenForo_Captcha_Abstract::isValid()
  */
 public function isValid(array $input)
 {
     if (!$this->_keyUserId) {
         return true;
         // if not configured, always pass
     }
     if (empty($input['keycaptcha_code']) || !is_string($input['keycaptcha_code'])) {
         return false;
     }
     $parts = explode('|', $input['keycaptcha_code']);
     if (count($parts) < 4) {
         return false;
     }
     if ($parts[0] !== md5('accept' . $parts[1] . $this->_privateKey . $parts[2])) {
         return false;
     }
     if (substr($parts[2], 0, 7) !== 'http://') {
         return false;
     }
     try {
         $client = XenForo_Helper_Http::getClient($parts[2]);
         $contents = trim($client->request('GET')->getBody());
         return $contents == '1';
     } catch (Zend_Http_Client_Adapter_Exception $e) {
         // this is an exception with the underlying request, so let it go through
         XenForo_Error::logException($e, false, 'KeyCAPTCHA connection error:');
         return true;
     }
 }
 /**
  * Checks if the $post is the one specified in the $unreadLink. If the $unreadLink is
  * empty or there is no post id in the link, true will be return asap.
  * Please note that for the entire request, this method only return true once.
  *
  * Usage: {xen:helper wf_unreadLinkPost, $unreadLink, $post, $posts}
  * Recommended position: hook:message_below
  *
  * @param string $unreadLink
  * @param array $post
  * @param array $posts
  * @return bool
  */
 public function unreadLinkPost($unreadLink, $post, $posts)
 {
     static $found = false;
     static $postFragment = '#post-';
     if ($found) {
         // return true once
         return false;
     }
     if (!is_array($post) || !isset($post['post_id']) || !is_array($posts)) {
         // incorrect usage...
         if (XenForo_Application::debugMode()) {
             XenForo_Error::logError('{xen:helper wf_unreadLinkPost} requires (string $unreadLink),' . ' (array $post), (array $posts)');
         }
         $found = true;
     } else {
         $postPos = strpos($unreadLink, $postFragment);
         if ($postPos === false) {
             // wait for the last post and return true
             $postIds = array_keys($posts);
             $lastPostId = array_pop($postIds);
             $found = $lastPostId == $post['post_id'];
         } else {
             // return true for the specified unread post
             $unreadLinkPostId = substr($unreadLink, $postPos + strlen($postFragment));
             $found = $unreadLinkPostId == $post['post_id'];
         }
     }
     return $found;
 }
Example #8
0
 public function execute(array $deferred, array $data, $targetRunTime, &$status)
 {
     $s = microtime(true);
     /* @var $cronModel XenForo_Model_Cron */
     $cronModel = XenForo_Model::create('XenForo_Model_Cron');
     XenForo_Application::defer('Cron', array(), 'cron', false, XenForo_Application::$time + 300);
     $entries = $cronModel->getCronEntriesToRun();
     foreach ($entries as $entry) {
         if (!$cronModel->updateCronRunTimeAtomic($entry)) {
             continue;
         }
         try {
             $cronModel->runEntry($entry);
         } catch (Exception $e) {
             // suppress so we don't get stuck
             XenForo_Error::logException($e);
         }
         $runTime = microtime(true) - $s;
         if ($targetRunTime && $runTime > $targetRunTime) {
             break;
         }
     }
     $cronModel->updateMinimumNextRunTime();
     return false;
 }
 public function renderRaw()
 {
     $attachment = $this->_params['attachment'];
     if (!headers_sent() && function_exists('header_remove')) {
         header_remove('Expires');
         header('Cache-control: private');
     }
     $extension = XenForo_Helper_File::getFileExtension($attachment['filename']);
     $imageTypes = array('svg' => 'image/svg+xml', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png');
     if (isset($imageTypes[$extension]) && ($attachment['width'] && $attachment['height'])) {
         $this->_response->setHeader('Content-type', $imageTypes[$extension], true);
         $this->setDownloadFileName($attachment['filename'], true);
     } else {
         $this->_response->setHeader('Content-type', 'application/octet-stream', true);
         $this->setDownloadFileName($attachment['filename']);
     }
     $this->_response->setHeader('ETag', '"' . $attachment['attach_date'] . '"', true);
     $this->_response->setHeader('Content-Length', $attachment['file_size'], true);
     $this->_response->setHeader('X-Content-Type-Options', 'nosniff');
     $attachmentFile = $this->_params['attachmentFile'];
     $options = XenForo_Application::getOptions();
     if ($options->SV_AttachImpro_XAR) {
         if (SV_AttachmentImprovements_AttachmentHelper::ConvertFilename($attachmentFile)) {
             if (XenForo_Application::debugMode() && $options->SV_AttachImpro_log) {
                 XenForo_Error::debug('X-Accel-Redirect:' . $attachmentFile);
             }
             $this->_response->setHeader('X-Accel-Redirect', $attachmentFile);
             return '';
         }
         if (XenForo_Application::debugMode() && $options->SV_AttachImpro_log) {
             XenForo_Error::debug('X-Accel-Redirect skipped');
         }
     }
     return new XenForo_FileOutput($attachmentFile);
 }
Example #10
0
 /** DEBUG FUNCTION **/
 private static function logExceptionByType($m, $t)
 {
     if ($m && ($t === 1 && self::$dCacheHit || $t === 2 && self::$dFetching)) {
         return XenForo_Error::logException(new XenForo_Exception($m));
     } else {
         return false;
     }
 }
Example #11
0
 private static function logExceptionByType($message, $type)
 {
     if ($type === 1 && self::$debugCacheHit || $type === 2 && self::$debugCurl) {
         return XenForo_Error::logException(new XenForo_Exception($message));
     } else {
         return false;
     }
 }
Example #12
0
 public static function createUser(array $data, array $provider, array $externalToken, array $externalVisitor, XenForo_Model_UserExternal $userExternalModel)
 {
     $user = null;
     /** @var bdApiConsumer_XenForo_Model_UserExternal $userExternalModel */
     $options = XenForo_Application::get('options');
     /** @var XenForo_DataWriter_User $writer */
     $writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
     if ($options->registrationDefaults) {
         $writer->bulkSet($options->registrationDefaults, array('ignoreInvalidFields' => true));
     }
     if (!isset($data['timezone']) and isset($externalVisitor['user_timezone_offset'])) {
         $tzOffset = $externalVisitor['user_timezone_offset'];
         $tzName = timezone_name_from_abbr('', $tzOffset, 1);
         if ($tzName !== false) {
             $data['timezone'] = $tzName;
         }
     }
     if (!empty($data['user_id'])) {
         $writer->setImportMode(true);
     }
     $writer->bulkSet($data);
     if (!empty($data['user_id'])) {
         $writer->setImportMode(false);
     }
     $writer->set('email', $externalVisitor['user_email']);
     if (!empty($externalVisitor['user_gender'])) {
         $writer->set('gender', $externalVisitor['user_gender']);
     }
     if (!empty($externalVisitor['user_dob_day']) && !empty($externalVisitor['user_dob_month']) && !empty($externalVisitor['user_dob_year'])) {
         $writer->set('dob_day', $externalVisitor['user_dob_day']);
         $writer->set('dob_month', $externalVisitor['user_dob_month']);
         $writer->set('dob_year', $externalVisitor['user_dob_year']);
     }
     if (!empty($externalVisitor['user_register_date'])) {
         $writer->set('register_date', $externalVisitor['user_register_date']);
     }
     $userExternalModel->bdApiConsumer_syncUpOnRegistration($writer, $externalToken, $externalVisitor);
     $auth = XenForo_Authentication_Abstract::create('XenForo_Authentication_NoPassword');
     $writer->set('scheme_class', $auth->getClassName());
     $writer->set('data', $auth->generate(''), 'xf_user_authenticate');
     $writer->set('user_group_id', XenForo_Model_User::$defaultRegisteredGroupId);
     $writer->set('language_id', XenForo_Visitor::getInstance()->get('language_id'));
     $writer->advanceRegistrationUserState(false);
     // TODO: option for extra user group
     $writer->preSave();
     if ($writer->hasErrors()) {
         return $user;
     }
     try {
         $writer->save();
         $user = $writer->getMergedData();
         $userExternalModel->bdApiConsumer_updateExternalAuthAssociation($provider, $externalVisitor['user_id'], $user['user_id'], array_merge($externalVisitor, array('token' => $externalToken)));
         XenForo_Model_Ip::log($user['user_id'], 'user', $user['user_id'], 'register_api_consumer');
     } catch (XenForo_Exception $e) {
         XenForo_Error::logException($e, false);
     }
     return $user;
 }
 public function execute(array $deferred, array $data, $targetRunTime, &$status)
 {
     $data = array_merge(array('batch' => 100, 'position' => 0), $data);
     /* @var $attachmentModel XenForo_Model_Attachment */
     $attachmentModel = XenForo_Model::create('XenForo_Model_Attachment');
     $s = microtime(true);
     $dataIds = $attachmentModel->getAttachmentDataIdsInRange($data['position'], $data['batch']);
     if (sizeof($dataIds) == 0) {
         return false;
     }
     foreach ($dataIds as $dataId) {
         $data['position'] = $dataId;
         $dw = XenForo_DataWriter::create('XenForo_DataWriter_AttachmentData', XenForo_DataWriter::ERROR_SILENT);
         if ($dw->setExistingData($dataId) && $dw->get('width') && XenForo_Image_Abstract::canResize($dw->get('width'), $dw->get('height'))) {
             $attach = $dw->getMergedData();
             $attachFile = $attachmentModel->getAttachmentDataFilePath($attach);
             $imageInfo = @getimagesize($attachFile);
             if ($imageInfo) {
                 try {
                     $image = XenForo_Image_Abstract::createFromFile($attachFile, $imageInfo[2]);
                 } catch (Exception $e) {
                     XenForo_Error::logException($e, false, "Thumbnail rebuild error {$attachFile}: ");
                     continue;
                 }
                 if ($image) {
                     if ($image->thumbnail(XenForo_Application::get('options')->attachmentThumbnailDimensions)) {
                         ob_start();
                         $image->output($imageInfo[2]);
                         $thumbData = ob_get_contents();
                         ob_end_clean();
                     } else {
                         // no resize necessary, use the original
                         $thumbData = file_get_contents($attachFile);
                     }
                     $dw->set('thumbnail_width', $image->getWidth());
                     $dw->set('thumbnail_height', $image->getHeight());
                     $dw->setExtraData(XenForo_DataWriter_AttachmentData::DATA_THUMB_DATA, $thumbData);
                     try {
                         $dw->save();
                     } catch (Exception $e) {
                         XenForo_Error::logException($e, false, "Thumb rebuild for #{$dataId}: ");
                     }
                     unset($image);
                 }
             }
         }
         if ($targetRunTime && microtime(true) - $s > $targetRunTime) {
             break;
         }
     }
     $actionPhrase = new XenForo_Phrase('rebuilding');
     $typePhrase = new XenForo_Phrase('attachment_thumbnails');
     $status = sprintf('%s... %s (%s)', $actionPhrase, $typePhrase, XenForo_Locale::numberFormat($data['position']));
     return $data;
 }
Example #14
0
 public function actionStaffShare()
 {
     $visitor = XenForo_Visitor::getInstance();
     if (!$visitor->hasPermission('general', 'bdSocialShare_staffShare')) {
         return $this->responseNoPermission();
     }
     $url = $this->_input->filterSingle('url', XenForo_Input::STRING);
     if (empty($url)) {
         return $this->responseView('bdSocialShare_ViewPublic_Misc_StaffShare_UrlForm', 'bdsocialshare_staff_share_url_form');
     }
     $request = new Zend_Controller_Request_Http($url);
     $request->setParamSources(array());
     $routeMatch = bdSocialShare_Listener::getDependencies()->route($request);
     $shareable = $this->getModelFromCache('bdSocialShare_Model_Publisher')->getShareableForRouteMatchAndRequest($routeMatch, $request);
     if (empty($shareable)) {
         return $this->responseMessage(new XenForo_Phrase('bdsocialshare_url_x_is_not_supported', array('url' => $url)));
     }
     $userModel = $this->getModelFromCache('XenForo_Model_User');
     $viewingUserGuest = $userModel->getVisitingGuestUser();
     $userModel->bdSocialShare_prepareViewingUser($viewingUserGuest);
     $shareable->setViewingUser($viewingUserGuest);
     $publisherModel = $this->getModelFromCache('bdSocialShare_Model_Publisher');
     $facebookAccounts = false;
     if (bdSocialShare_Option::hasPermissionFacebook($viewingUserGuest)) {
         $facebookAccounts = $this->getModelFromCache('bdSocialShare_Model_Facebook')->getAccounts();
     }
     $twitterAccounts = false;
     if (bdSocialShare_Option::hasPermissionTwitter($viewingUserGuest)) {
         $twitterAccounts = $this->getModelFromCache('bdSocialShare_Model_Twitter')->getAccounts();
     }
     if ($this->isConfirmedPost()) {
         $target = $this->_input->filterSingle('target', XenForo_Input::STRING);
         $targetId = $this->_input->filterSingle('target_id', XenForo_Input::STRING);
         $data = $this->_input->filter(array('userText' => XenForo_Input::STRING, 'title' => XenForo_Input::STRING, 'description' => XenForo_Input::STRING, 'image' => XenForo_Input::STRING));
         $data['link'] = $shareable->getLink($publisherModel);
         $staffShareSharable = new bdSocialShare_Shareable_StaffShare($data);
         $published = false;
         try {
             $published = $publisherModel->publish($target, $targetId, $staffShareSharable, $viewingUserGuest);
         } catch (XenForo_Exception $e) {
             XenForo_Error::logException($e);
         }
         if ($published) {
             XenForo_Model_Log::logModeratorAction('bdsocialshare_all', $data, $target, array('target_id' => $targetId));
             return $this->responseMessage(new XenForo_Phrase('bdsocialshare_staff_share_published_successfully'));
         } else {
             return $this->responseError(new XenForo_Phrase('unexpected_error_occurred'));
         }
     }
     $viewParams = array('facebookAccounts' => $facebookAccounts, 'twitterAccounts' => $twitterAccounts, 'hasAdminPermissionOption' => $visitor->hasAdminPermission('option'), 'url' => $url, 'link' => $shareable->getLink($publisherModel), 'userText' => strval($shareable->getUserText($publisherModel)), 'title' => strval($shareable->getTitle($publisherModel)), 'description' => strval($shareable->getDescription($publisherModel)), 'image' => $shareable->getImage($publisherModel));
     return $this->responseView('bdSocialShare_ViewPublic_Misc_StaffShare', 'bdsocialshare_staff_share', $viewParams);
 }
Example #15
0
 public function insertTranscodeQueue(array $data)
 {
     XenForo_Application::getDb()->insert('xengallery_transcode_queue', array('queue_data' => @serialize($data), 'queue_date' => XenForo_Application::$time));
     if (!$this->isDeferredQueued()) {
         try {
             XenForo_Application::defer('XenGallery_Deferred_TranscodeQueue', array(), 'TranscodeQueue');
         } catch (Exception $e) {
             // need to just ignore this and let it get picked up later
             XenForo_Error::logException($e, false);
         }
     }
     return true;
 }
Example #16
0
 protected function _postDelete()
 {
     parent::_postDelete();
     $discordId = $this->getExisting('da_discord_id');
     if ($discordId !== null) {
         XenForo_CodeEvent::addListener('controller_post_dispatch', function ($c, $r, $n, $a) use($discordId) {
             try {
                 self::refreshDiscordId($discordId);
             } catch (Exception $e) {
                 XenForo_Error::logException($e, false);
             }
         });
     }
 }
Example #17
0
 /**
  * Gets Facebook user info from the specified place.
  *
  * @param string $accessToken FB access token (from code swap, or given by user); may be empty
  * @param string $path Path to access (defaults to "me")
  *
  * @return array Info; may be error
  */
 public static function getUserInfo($accessToken, $path = 'me')
 {
     try {
         $client = XenForo_Helper_Http::getClient('https://graph.facebook.com/' . $path);
         if ($accessToken) {
             $client->setParameterGet('access_token', $accessToken);
         }
         $response = $client->request('GET');
         return json_decode($response->getBody(), true);
     } catch (Zend_Http_Client_Exception $e) {
         XenForo_Error::logException($e, false);
         return false;
     }
 }
Example #18
0
 protected function _postSave()
 {
     if ($this->isInsert()) {
         $function = sprintf('_sendAlerts_%s', $this->get('comment_type'));
         $comment = $this->getMergedData();
         $team = $this->_getTeamData();
         try {
             $this->{$function}($comment, $team);
         } catch (Exception $e) {
             XenForo_Error::logException($e);
         }
         // should be update new feed!
         $this->_publishToNewsFeed();
         $db = $this->_db;
         $db->update('xf_team', array('last_activity' => XenForo_Application::$time), 'team_id = ' . $db->quote($this->get('team_id')));
     }
 }
Example #19
0
 /**
  * Run all (or as many as possible) outstanding cron entries.
  * Confirms via an atomic update that the entries are runnable first.
  */
 public function run()
 {
     /* @var $cronModel XenForo_Model_Cron */
     $cronModel = XenForo_Model::create('XenForo_Model_Cron');
     $entries = $cronModel->getCronEntriesToRun();
     foreach ($entries as $entry) {
         if (!$cronModel->updateCronRunTimeAtomic($entry)) {
             continue;
         }
         try {
             $cronModel->runEntry($entry);
         } catch (Exception $e) {
             // suppress so we don't get stuck
             XenForo_Error::logException($e);
         }
     }
     $cronModel->updateMinimumNextRunTime();
 }
 public function execute(array $deferred, array $data, $targetRunTime, &$status)
 {
     /* @var $emailModel XenForo_Model_EmailBounce */
     $emailModel = XenForo_Model::create('XenForo_Model_EmailBounce');
     if (!isset($data['start'])) {
         $data['start'] = time();
     }
     $s = microtime(true);
     try {
         $connection = $emailModel->openBounceHandlerConnection();
         if (!$connection) {
             return false;
         }
     } catch (Zend_Mail_Exception $e) {
         XenForo_Error::logException($e);
         return false;
     }
     $total = $connection->countMessages();
     if (!$total) {
         return false;
     }
     $finished = true;
     for ($messageId = $total, $i = 0; $messageId > 0; $messageId--, $i++) {
         if ($i > 0 && $targetRunTime && microtime(true) - $s >= $targetRunTime) {
             $finished = false;
             break;
         }
         $headers = $connection->getRawHeader($messageId);
         $content = $connection->getRawContent($messageId);
         $connection->removeMessage($messageId);
         $rawMessage = trim($headers) . "\r\n\r\n" . trim($content);
         $emailModel->processBounceEmail($rawMessage);
     }
     $connection->close();
     if ($finished) {
         return false;
     } else {
         if (time() - $data['start'] > 60 * 30) {
             // don't let a single run of this run for more than 30 minutes
             return false;
         }
         return $data;
     }
 }
 public function deleteMulti($itemNamePattern)
 {
     $cache = $this->_getCache(true);
     if (empty($cache)) {
         if (empty(self::$loggedMissingRedis)) {
             self::$loggedMissingRedis = true;
             XenForo_Error::logException(new Exception("No Cache setup"));
         }
         return;
     }
     $credis = $this->getCredis($cache);
     if (empty($credis)) {
         if (empty(self::$loggedMissingRedis)) {
             self::$loggedMissingRedis = true;
             XenForo_Error::logException(new Exception("Redis Cache is not setup"));
         }
         return;
     }
     $prefix = Cm_Cache_Backend_Redis::PREFIX_KEY . $cache->getOption('cache_id_prefix');
     $pattern = $prefix . $itemNamePattern;
     // indicate to the redis instance would like to process X items at a time.
     $count = 1000;
     // find indexes matching the pattern
     $cursor = null;
     $keys = array();
     while (true) {
         $next_keys = $credis->scan($cursor, $pattern, $count);
         // scan can return an empty array
         if ($next_keys) {
             $keys += $next_keys;
         }
         if (empty($cursor) || $next_keys === false) {
             break;
         }
     }
     if ($keys) {
         // delete them, use pipelining
         $credis->pipeline()->multi();
         foreach ($keys as $key) {
             $credis->del($key);
         }
         $credis->exec();
     }
 }
Example #22
0
 /**
  * Determines if CAPTCHA is valid (passed).
  *
  * @see XenForo_Captcha_Abstract::isValid()
  */
 public function isValid(array $input)
 {
     if (!$this->_config['privateKey'] || !$this->_config['publicKey']) {
         return true;
         // if not configured, always pass
     }
     if (empty($input['recaptcha_challenge_field']) || empty($input['recaptcha_response_field'])) {
         return false;
     }
     try {
         $recaptcha = new Zend_Service_ReCaptcha($this->_config['publicKey'], $this->_config['privateKey']);
         $result = $recaptcha->verify($input['recaptcha_challenge_field'], $input['recaptcha_response_field']);
         return $result->isValid();
     } catch (Zend_Http_Client_Adapter_Exception $e) {
         // this is an exception with the underlying request, so let it go through
         XenForo_Error::logException($e, false);
         return true;
     }
 }
Example #23
0
 public static function getGroups($accessToken)
 {
     try {
         $client = XenForo_Helper_Http::getClient('https://graph.facebook.com/v2.0/me/groups');
         $client->setParameterGet('access_token', $accessToken);
         $response = $client->request('GET');
         $jsonDecoded = json_decode($response->getBody(), true);
         if (!empty($jsonDecoded['data'])) {
             $groups = array();
             foreach ($jsonDecoded['data'] as $entry) {
                 $groups[$entry['id']] = array('name' => $entry['name'], 'target_id' => bdSocialShare_Helper_Common::encryptTargetId($entry['name'], array('targetId' => $entry['id'], 'accessToken' => $accessToken, 'type' => 'group')));
             }
             return $groups;
         }
     } catch (Zend_Http_Client_Exception $e) {
         if (XenForo_Application::debugMode()) {
             XenForo_Error::logException($e, false);
         }
     }
     return false;
 }
Example #24
0
 public function isValidTag($tag)
 {
     $length = utf8_strlen($tag);
     $lengthLimits = XenForo_Application::getOptions()->tagLength;
     $minLength = max($lengthLimits['min'], 1);
     $maxLength = $lengthLimits['max'] <= 0 ? 100 : min($lengthLimits['max'], 100);
     if ($length < $minLength) {
         return false;
     }
     if ($length > $maxLength) {
         return false;
     }
     $validation = XenForo_Application::getOptions()->tagValidation;
     $disallowed = preg_split('/\\r?\\n/', $validation['disallowedWords']);
     if ($disallowed) {
         foreach ($disallowed as $disallowedCheck) {
             $disallowedCheck = trim($disallowedCheck);
             if ($disallowedCheck === '') {
                 continue;
             }
             if (stripos($tag, $disallowedCheck) !== false) {
                 return false;
             }
         }
     }
     if ($validation['matchRegex'] && !preg_match('/\\W[\\s\\w]*e[\\s\\w]*$/', $validation['matchRegex'])) {
         try {
             if (!preg_match($validation['matchRegex'], $tag)) {
                 return false;
             }
         } catch (Exception $e) {
             XenForo_Error::logException($e, false);
         }
     }
     $censored = XenForo_Helper_String::censorString($tag);
     if ($censored != $tag) {
         return false;
     }
     return true;
 }
 public function parseSVG($filename)
 {
     $svgfile = null;
     try {
         if (method_exists('XenForo_Helper_DevelopmentXml', 'scanFile')) {
             $svgfile = XenForo_Helper_DevelopmentXml::scanFile($filename);
         } else {
             $svgfile = new SimpleXMLElement($filename, 0, true);
         }
     } catch (Exception $e) {
         XenForo_Error::logException($e, false);
         $svgfile = null;
     }
     if (empty($svgfile)) {
         return null;
     }
     // check for bad tags
     $options = XenForo_Application::getOptions();
     $badTags = array_fill_keys(explode(',', strtolower($options->SV_AttachImpro_badTags)), true);
     $badAttributes = array_fill_keys(explode(',', strtolower($options->SV_AttachmentImprovements_badAttributes)), true);
     return $this->_scanSVG($svgfile, $badTags, $badAttributes);
 }
Example #26
0
 /**
  *
  * @see XenForo_ControllerPublic_Account::actionPrivacySave()
  */
 public function actionPrivacySave()
 {
     if (ThemeHouse_Listener_ControllerPreDispatch::isAddOnEnabled('xfa_blogs')) {
         try {
             $userId = XenForo_Visitor::getUserId();
             $allowViewBlog = $this->_input->filterSingle('allow_view_blog', XenForo_Input::STRING);
             $allowViewBlogGroup = 0;
             if (is_numeric($allowViewBlog)) {
                 $allowViewBlogGroup = $allowViewBlog;
                 $this->_request->setParam('allow_view_blog', 'group');
             }
             // save the privacy settings
             if ($userId) {
                 $db = XenForo_Application::getDb();
                 $db->query("UPDATE xf_user_privacy SET allow_view_blog_group = ? WHERE user_id = ?", array($allowViewBlogGroup, $userId));
             }
         } catch (Exception $ex) {
             XenForo_Error::logException($ex, false);
         }
     }
     return parent::actionPrivacySave();
 }
Example #27
0
 public function handle($addOnId)
 {
     try {
         $addOnId = strtolower($addOnId);
         $root = XenForo_Application::getInstance()->getRootDir() . '/styles';
         if (!($root = realpath($root)) || !is_dir($root)) {
             return;
         }
         $source = $root . '/default/' . $addOnId;
         if (!($source = realpath($source)) || !is_dir($source)) {
             return;
         }
         $available = GFNCore_Helper_Directory::read($root, false);
         foreach ($available as $i => $path) {
             if (is_dir($path) && basename($path) != 'default') {
                 $target = $path . '/' . $addOnId;
                 GFNCore_Helper_Directory::copy($source, $target);
             }
         }
     } catch (Exception $e) {
         XenForo_Error::logException($e, false);
     }
 }
 public function call($service, array $params = array())
 {
     $client = $this->_getXmlRpcClient();
     if (!$client) {
         return array();
     }
     if ($service != 'DataService.getTemporaryKey') {
         $key = XenForo_Application::get('options')->th_infusionsoftApi_key;
         array_unshift($params, $key);
     }
     try {
         $result = $client->call($service, $params);
     } catch (Zend_XmlRpc_Client_FaultException $e) {
         $message = $e->getMessage();
         preg_match('#^\\[([A-z]*)\\](.*)$#', $message, $matches);
         if ($matches) {
             return array('error' => array($matches[1] => $matches[2]));
         }
         XenForo_Error::logException($e, false);
         return array();
     }
     return $result;
 }
Example #29
0
 public function actionRespond()
 {
     $form = $this->_getFormOrError($this->_input->filterSingle('form_id', XenForo_Input::UINT));
     $fieldModel = $this->_getFieldModel();
     $destinationOptionModel = $this->_getDestinationOptionModel();
     $attachmentModel = $this->getModelFromCache('XenForo_Model_Attachment');
     $attachmentParams = array();
     $constraints = $attachmentModel->getAttachmentConstraints();
     // check to see if attachments are enabled
     $attachmentTypes = $destinationOptionModel->getAttachmentsDestinationHandlers($form['form_id']);
     if ($attachmentTypes) {
         $attachmentParams = array('hash' => md5(uniqid('', true)), 'content_type' => 'form', 'content_data' => array('form_id' => $form['form_id']));
         $attachmentHandler = $attachmentModel->getAttachmentHandler($attachmentParams['content_type']);
         if (!$attachmentHandler || !$attachmentHandler->canUploadAndManageAttachments($attachmentParams['content_data'])) {
             XenForo_Error::debug('form_destination_id ' . $form_destination_id . ' does not accept attachments for the user ' . XenForo_Visitor::getUserId());
             throw new XenForo_Exception(new XenForo_Phrase('attachment_cannot_be_shown_at_this_time'), true);
         }
         $constraints = $attachmentHandler->getAttachmentConstraints();
     }
     $params = array();
     if (XenForo_Visitor::getUserId()) {
         $params['visitor'] = XenForo_Visitor::getInstance();
     } else {
         $params['visitor'] = array('username' => 'Guest');
     }
     // process GET supplied default values
     $fields = $fieldModel->prepareFields($fieldModel->getFields(array('form_id' => $form['form_id'])), true);
     foreach ($fields as $fieldId => &$field) {
         $field['default_value'] = $this->_renderTemplate($field['default_value'], $params);
         $getDefaultValue = $this->_input->filterSingle($field['field_name'], XenForo_Input::STRING);
         if ($getDefaultValue) {
             $field['default_value'] = $getDefaultValue;
         }
     }
     $viewParams = array('form' => $form, 'fields' => $fields, 'attachmentManager' => !empty($attachmentTypes), 'attachmentParams' => $attachmentParams, 'attachmentConstraints' => $constraints, 'captcha' => XenForo_Captcha_Abstract::createDefault());
     return $this->responseView('LiquidPro_SimpleForms_ViewPublic_Form_Respond', 'form_respond', $viewParams);
 }
Example #30
0
 public function recover($target, $recovery = false)
 {
     if ($recovery === false) {
         $recovery = $this->loadRecoveryData();
     }
     // reset recovery asap, it will be updated later
     $this->_getPublisherModel()->saveRecoveryData();
     $recovered = true;
     if (empty($recovery) or empty($recovery['shareable']) or empty($recovery['targets'])) {
         return false;
     }
     if (empty($recovery['targets'][$target])) {
         return false;
     }
     $targetId = $recovery['targets'][$target];
     $shareable = bdSocialShare_Shareable_Abstract::createFromRecoveryData($recovery['shareable']);
     if (empty($shareable)) {
         return false;
     }
     try {
         $this->_getPublisherModel()->publish($target, $targetId, $shareable);
         $this->_getPublisherModel()->postPublish($shareable);
         $recovered = true;
     } catch (bdSocialShare_Exception_Abstract $e) {
         if (XenForo_Application::debugMode()) {
             XenForo_Error::logException($e, false);
         }
     }
     if ($recovered) {
         // remove the target from the queue
         unset($recovery['targets'][$target]);
     }
     if (!empty($recovery['targets'])) {
         // still have something in queue, set recovery...
         $this->_getPublisherModel()->saveRecoveryData($recovery['shareable'], $recovery['targets']);
     }
 }