| Current Path : /var/www/iplanru/data/www/www.i-plan.ru/components/com_zoo/controllers/ | 
| Current File : /var/www/iplanru/data/www/www.i-plan.ru/components/com_zoo/controllers/comment.php | 
<?php
/**
* @package   com_zoo
* @author    YOOtheme http://www.yootheme.com
* @copyright Copyright (C) YOOtheme GmbH
* @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
*/
/*
	Class: CommentController
		The controller class for comments
*/
class CommentController extends AppController {
    /*
       Variable: author
         Active author.
    */
	public $author;
	public $application;
 	/*
		Function: Constructor
		Parameters:
			$default - Array
		Returns:
			DefaultController
	*/
	public function __construct($default = array()) {
		parent::__construct($default);
		// get user
		$this->user = $this->app->user->get();
		// get application
		$this->application = $this->app->zoo->getApplication();
		// get comment params
		$this->params = $this->app->parameter->create($this->application->getParams()->get('global.comments.'));
	}
	public function save() {
		// check for request forgeries
		$this->app->session->checkToken() or jexit('Invalid Token');
		// set currently active author
		$this->author = $this->app->comment->activeAuthor();
		// init vars
		$redirect = $this->app->request->getString('redirect');
		$login 	  = $this->app->request->getCmd(CommentHelper::COOKIE_PREFIX.'login', '', 'cookie');
		if ($this->author->getUserType() == $login) {
			if ($this->params->get('enable_comments', false)) {
				// init vars
				$content   = $this->app->request->getVar('content', null, '', 'string', JREQUEST_ALLOWRAW);
				$item_id   = $this->app->request->getInt('item_id', 0);
				$parent_id = $this->app->request->getInt('parent_id', 0);
				// filter content
				$content = $this->app->comment->filterContentInput($content);
				// set content in session
				$this->app->session->set('com_zoo.comment.content', $content);
				// set author name, email and url, if author is guest
				if ($this->author->isGuest()) {
					$this->author->name  = $this->app->request->getString('author');
					$this->author->email = $this->app->request->getString('email');
					$this->author->url   = $this->app->request->getString('url');
					// save cookies
					$this->app->comment->saveCookies($this->author->name, $this->author->email, $this->author->url);
				}
				try {
					// Check captcha
					if ($plugin = $this->params->get('captcha', false) and (!$this->params->get('captcha_guest_only', 0) or !$this->app->user->get()->id)){
						$captcha = JCaptcha::getInstance($plugin);
		            	if (!$captcha->checkAnswer($this->app->request->getString('captcha', ''))) {
		            		$error = $captcha->getError();
							if (!($error instanceof Exception)) {
								$error = new JException($error);
							}
		                	throw new CommentControllerException(JText::_('ZOO_CHECK_CAPTCHA') . ' - ' . $error );
		            	}
					}
					// get comment table
					$table = $this->app->table->comment;
					// get parent
					$parent    = $table->get($parent_id);
					$parent_id = ($parent && $parent->item_id == $item_id) ? $parent->id : 0;
					// create comment
					$comment = $this->app->object->create('Comment');
					$comment->parent_id = $parent_id;
					$comment->item_id = $item_id;
					$comment->ip = $this->app->useragent->ip();
					$comment->created = $this->app->date->create()->toSQL();
					$comment->content = $content;
					$comment->state = Comment::STATE_UNAPPROVED;
					// auto approve comment
					$approved = $this->params->get('approved', 0);
					if ($this->author->isJoomlaAdmin()) {
						$comment->state = Comment::STATE_APPROVED;
					} else if ($approved == 1) {
						$comment->state = Comment::STATE_APPROVED;
					} else if ($approved == 2 && $table->getApprovedCommentCount($this->author)) {
						$comment->state = Comment::STATE_APPROVED;
					}
					// bind Author
					$comment->bindAuthor($this->author);
					// validate comment, if not an administrator
					if (!$this->author->isJoomlaAdmin()) {
						$this->_validate($comment);
					}
					// save comment
					$table->save($comment);
					// remove content from session, if comment was saved
					$this->app->session->set('com_zoo.comment.content', '');
				} catch (CommentControllerException $e) {
					// raise warning on exception
					$this->app->error->raiseWarning(0, (string) $e);
				} catch (AppException $e) {
					// raise warning on exception
					$this->app->error->raiseWarning(0, JText::_('ERROR_SAVING_COMMENT'));
					// add exception details, for super administrators only
					if ($this->user->superadmin) {
						$this->app->error->raiseWarning(0, (string) $e);
					}
				}
				// add anchor to redirect, if comment was saved
				if ($comment->id) {
					$redirect .= '#comment-'.$comment->id;
				}
			} else {
				// raise warning on comments not enabled
				$this->app->error->raiseWarning(0, JText::_('Comments are not enabled.'));
			}
		} else {
			// raise warning on exception
			$this->app->error->raiseWarning(0, JText::_('ERROR_SAVING_COMMENT'));
			// add exception details, for super administrators only
			if ($this->user->superadmin) {
				$this->app->error->raiseWarning(0, JText::_('User types didn\'t match.'));
			}
		}
		$this->setRedirect($redirect);
	}
	public function unsubscribe() {
		// init vars
		$item_id  = $this->app->request->getInt('item_id');
		$email	  = $this->app->request->getString('email');
		$hash	  = $this->app->request->getCmd('hash');
		$msg	  = '';
		$redirect = 'index.php';
		try {
			if ($hash != $this->app->comment->getCookieHash($email, $item_id, '')) {
				throw new CommentControllerException('Hashes did not match.');
			}
			// subscribe author to item
			if (!($item = $this->app->table->item->get($item_id))) {
				throw new CommentControllerException('Item not found.');
			}
			$this->app->table->item->save($item->unsubscribe($email));
			$redirect = $this->app->route->item($item, false);
			$msg = JText::_('SUCCESSFULLY_UNSUBSCRIBED');
		} catch (CommentControllerException $e) {
			// raise warning on exception
			$this->app->error->raiseWarning(0, (string) $e);
		} catch (AppException $e) {
			// raise warning on exception
			$this->app->error->raiseWarning(0, JText::_('ERROR_UNSUBSCRIBING'));
			// add exception details, for super administrators only
			if ($this->user->superadmin) {
				$this->app->error->raiseWarning(0, (string) $e);
			}
		}
		$this->setRedirect(JRoute::_($redirect), $msg);
	}
	protected function _validate($comment) {
		// get params
		$require_author 		 = $this->params->get('require_name_and_mail', 0);
		$registered     		 = $this->params->get('registered_users_only', 0);
		$time_between_user_posts = $this->params->get('time_between_user_posts', 120);
		$blacklist      		 = $this->params->get('blacklist', '');
		// check if related item exists
		if ($this->app->table->item->get($comment->item_id) === null) {
			throw new CommentControllerException('Related item does not exists.');
		}
		// only registered users can comment
		if ($registered && $this->author->isGuest()) {
			throw new CommentControllerException('LOGIN_TO_LEAVE_OMMENT');
		}
		// validate required name/email
		if ($this->author->isGuest() && $require_author && (empty($comment->author) || empty($comment->email))) {
			throw new CommentControllerException('Please enter the required fields author and email.');
		}
		// validate email format
		try {
			$this->app->validator->create('email')->addOption('required', false)->clean($comment->email);
		} catch (AppValidatorException $e) {
			throw new CommentControllerException('Please enter a valid email address.');
		}
		// validate url format
		try {
			$this->app->validator->create('url')->addOption('required', false)->clean($comment->url);
		} catch (AppValidatorException $e) {
			throw new CommentControllerException('Please enter a valid website link.');
		}
		// check if content is empty
		if (empty($comment->content)) {
			throw new CommentControllerException('Please enter a comment.');
		}
		// check quick multiple posts
		if ($last = $this->app->table->comment->getLastComment($comment->ip, $this->author)) {
			if ($this->app->date->create($comment->created)->toUnix() < $this->app->date->create($last->created)->toUnix() + $time_between_user_posts) {
				throw new CommentControllerException('You are posting comments too quickly. Slow down a bit.');
			}
		}
		// check against spam blacklist
		if ($this->app->comment->matchWords($comment, $blacklist) && $comment->state != Comment::STATE_SPAM) {
			$comment->state = Comment::STATE_SPAM;
		}
		// check comment for spam (akismet)
		if ($this->params->get('akismet_enable', 0) && $comment->state != Comment::STATE_SPAM) {
			try {
				$this->app->comment->akismet($comment, $this->params->get('akismet_api_key'));
			} catch (Exception $e) {
				// re-throw exception, for super administrators only
				if ($this->user->superadmin) throw new AppException($e->getMessage());
			}
		}
		// check comment for spam (mollom)
		if ($this->params->get('mollom_enable', 0) && $comment->state != Comment::STATE_SPAM) {
			try {
				$this->app->comment->mollom($comment, $this->params->get('mollom_public_key'), $this->params->get('mollom_private_key'));
			} catch (Exception $e) {
				// re-throw exception, for super administrators only
				if ($this->user->superadmin) throw new AppException($e->getMessage());
			}
		}
	}
	public function facebookConnect() {
		// init vars
		$item_id = $this->app->request->getInt('item_id', 0);
		$item    = $this->app->table->item->get($item_id);
		// get facebook client
		$connection = $this->app->facebook->client();
		if ($connection && empty($connection->access_token)) {
			$redirect = JURI::root().'index.php?option='.$this->option.'&controller='.$this->controller.'&task=facebookauthenticate&item_id='.$item_id;
			$redirect = $connection->getAuthenticateURL($redirect);
		} else {
			// already connected
			$redirect = $this->app->route->item($item);
		}
		$this->setRedirect($redirect);
	}
	public function facebookAuthenticate() {
		// init vars
		$item_id = $this->app->request->getInt('item_id', 0);
		$item    = $this->app->table->item->get($item_id);
		// get facebook client
		$connection = $this->app->facebook->client();
		if ($connection) {
			$code = $this->app->request->getString('code', '');
			$redirect = JURI::root() .'index.php?option='.$this->option.'&controller='.$this->controller.'&task=facebookauthenticate&item_id='.$item_id;
			$url  = $connection->getAccessTokenURL($code, $redirect);
			$result = $this->app->http->get($url, array('ssl_verifypeer' => false));
			$token = str_replace('access_token=', '', $result['body']);
			$_SESSION['facebook_access_token'] = $token;
		}
		$this->setRedirect($this->app->route->item($item));
	}
	public function facebookLogout() {
		$this->app->facebook->logout();
		$this->setRedirect($this->app->request->getString('HTTP_REFERER', '', 'server'));
	}
	public function twitterConnect() {
		// get twitter client
		$connection = $this->app->twitter->client();
		// redirect to the referer after authorize/login procedure
		$referer = $this->app->request->getString('HTTP_REFERER', '', 'server');
		// retrieve request token only if token is not supplied already
		if ($connection && empty($connection->token)) {
			$redirect = JURI::root() .'index.php?option='.$this->option.'&app_id='.$this->application->id.'&controller='.$this->controller.'&task=twitterauthenticate&referer='.urlencode($referer);
			// get temporary credentials
			$request_token = $connection->getRequestToken($redirect);
			// save temporary credentials to session
			$_SESSION['twitter_oauth_token'] = $token = $request_token['oauth_token'];
			$_SESSION['twitter_oauth_token_secret'] = $request_token['oauth_token_secret'];
			// if last connection failed don't display authorization link
			switch ($connection->http_code) {
			  case 200:
			    // build authorize URL and redirect user to Twitter
			    $redirect = $connection->getAuthorizeURL($token);
			    break;
			  default:
			    // show notification if something went wrong.
				$this->app->error->raiseWarning(0, JText::_('ERROR_CONNECT_TWITTER'));
				$redirect = $referer;
			}
		} else {
			// already connected
			$redirect = $referer;
		}
		$this->setRedirect($redirect);
	}
	public function twitterAuthenticate() {
		// get twitter client
		$connection = $this->app->twitter->client();
		if ($connection) {
			// retrieve access token
			$token_credentials = $connection->getAccessToken($_REQUEST['oauth_verifier']);
			// replace request token with access token in session.
			if ($token_credentials) {
				$_SESSION['twitter_oauth_token'] = $token_credentials['oauth_token'];
				$_SESSION['twitter_oauth_token_secret'] = $token_credentials['oauth_token_secret'];
			} else {
				// show notification if something went wrong.
				$this->app->error->raiseWarning(0, JText::_('ERROR_CONNECT_TWITTER'));
			}
		}
		$this->setRedirect($this->app->request->getString('referer'));
	}
	public function twitterLogout() {
		$this->app->twitter->logout();
		$this->setRedirect($this->app->request->getString('HTTP_REFERER', '', 'server'));
	}
}
/*
	Class: CommentControllerException
*/
class CommentControllerException extends AppException {
	/**
	 * Converts the exception to a human readable string
	 *
	 * @return string The error message
	 *
	 * @since 1.0.0
	 */
	public function __toString() {
		return JText::_($this->getMessage());
	}
}