View file upload/packages/vbforum/taggablecontent/thread.php

File size: 9.36Kb
<?php if (!defined('VB_ENTRY')) die('Access denied.');
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 4.0.5
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2010 vBulletin Solutions Inc. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

require_once(DIR . '/includes/class_taggablecontent.php');
/**
* Handle thread specific logic
*
*	Internal class, should not be directly referenced
* use vB_Taggable_Content_Item::create to get instances
*	see vB_Taggable_Content_Item for method documentation
*/
class vBForum_TaggableContent_Thread extends vB_Taggable_Content_Item
{
	protected function load_content_info()
	{
		return verify_id('thread', $this->contentid, 1, 1);
	}

	public function can_delete_tag($taguserid)
	{
		$contentinfo = $this->fetch_content_info();

		//the user can delete his own tag associations
		if ($taguserid == $this->registry->userinfo['userid'])
		{
			return true;
		}

		if ($this->can_moderate_tag())
		{
			return true;
		}

		$forumperms = fetch_permissions($contentinfo['forumid']);
		return ($forumperms & $this->registry->bf_ugp_forumpermissions['candeletetagown']) AND
			$this->is_owned_by_current_user();
	}

	public function can_moderate_tag()
	{
		$contentinfo = $this->fetch_content_info();
		return can_moderate($contentinfo['forumid'], 'caneditthreads');
	}

	public function can_add_tag()
	{
		$contentinfo = $this->fetch_content_info();

		//forum lookups should be cached and therefore inexpensive
		$foruminfo = fetch_foruminfo($contentinfo['forumid']);
		$forumperms = fetch_permissions($contentinfo['forumid']);
		if (!$foruminfo['allowposting'] OR (!$contentinfo['open'] AND !can_moderate($contentinfo['forumid'], 'canopenclose')))
		{
			return false;
		}
		else
		{
			return (
				(($forumperms & $this->registry->bf_ugp_forumpermissions['cantagown']) AND $this->is_owned_by_current_user())
				OR ($forumperms & $this->registry->bf_ugp_forumpermissions['cantagothers'])
			);
		}
	}

	public function can_manage_tag()
	{
		$contentinfo = $this->fetch_content_info();

		//forum lookups should be cached and therefore inexpensive
		$foruminfo = fetch_foruminfo($contentinfo['forumid']);
		$forumperms = fetch_permissions($contentinfo['forumid']);
		if (!$foruminfo['allowposting'] OR (!$contentinfo['open'] AND !can_moderate($contentinfo['forumid'], 'canopenclose')))
		{
			return $this->can_moderate_tag();
		}
		else
		{
			return (
				$this->can_add_tag()
				OR (($forumperms & $this->registry->bf_ugp_forumpermissions['candeletetagown']) AND $this->is_owned_by_current_user())
				OR $this->can_moderate_tag()
			);
		}
	}

	public function is_owned_by_current_user()
	{
		$contentinfo = $this->fetch_content_info();
		return ($contentinfo['postuserid'] == $this->registry->userinfo['userid']);
	}

	public function fetch_content_type_diplay()
	{
		global $vbphrase;
		return $vbphrase['thread'];
	}

	public function rebuild_content_tags()
	{
		$contentinfo = $this->fetch_content_info();

		if (!$contentinfo)
		{
			return '';
		}

		// The thread dm needs the first post's page text and the tags in order to build the thread's meta tags
		$pagetext = $this->registry->db->query_first_slave("
			SELECT pagetext
			FROM " . TABLE_PREFIX . "post
			WHERE
				threadid = " . intval($contentinfo['threadid']) . "
					AND
				postid = " . intval($contentinfo['firstpostid']) . "
		");

		$tags = $this->fetch_existing_tag_list();
		$taglist = implode(', ', $tags);
		$dataman =& datamanager_init('Thread', $this->registry, ERRTYPE_SILENT, 'threadpost');
		$dataman->set_existing($contentinfo);
		$dataman->set_info('pagetext', $pagetext['pagetext']);
		$dataman->set('taglist', $taglist);
		$dataman->save();


		return $taglist;
	}

	public function is_cloud_cachable()
	{
		return ($this->registry->options['tagcloud_usergroup'] != -1);
	}

	public function fetch_tag_cloud_query_bits()
	{
		$forums = array();

		//limit cloud based on forum permissions
		$perm_limit = (boolean) $this->registry->options['tagcloud_usergroup'];
		if ($perm_limit)
		{
			foreach ($this->registry->forumcache AS $forumid => $forum)
			{
				//live permission checking
				if ($this->registry->options['tagcloud_usergroup'] == -1)
				{
					$perm_array = $this->registry->userinfo['forumpermissions']["$forumid"];
				}
				//usergroup permission checking
				else
				{
					$perm_array = $forum['permissions'][$this->registry->options['tagcloud_usergroup']];
				}

				if ($perm_array & $this->registry->bf_ugp_forumpermissions['canview']
					AND $perm_array & $this->registry->bf_ugp_forumpermissions['canviewthreads']
					AND $perm_array & $this->registry->bf_ugp_forumpermissions['canviewothers']
				)
				{
					$forums[] = intval($forumid);
				}
			}
		}

		if (!$perm_limit OR count($forums))
		{
			$contenttype = vB_Types::instance()->getContentTypeID("vBForum_Thread");
			$join['thread'] = "INNER JOIN " . TABLE_PREFIX . "thread AS thread ON (tagcontent.contentid = thread.threadid)";
			$where[] = "thread.open <> 10";
			$where[] = "thread.visible = 1";

			if(count($forums))
			{
				$where[] = "thread.forumid IN (" . implode(',', $forums) . ")";
			}

			return array('join' => $join, 'where' => $where);
		}
		else
		{
			return false;
		}
	}

	public function fetch_return_url()
	{
		$url = parent::fetch_return_url();
		if(!$url)
		{
			$url =  fetch_seo_url('thread', $this->fetch_content_info()) . '#taglist';
		}
		return $url;
	}

	public function fetch_page_nav()
	{
		global $vbphrase;
		$contentinfo = $this->fetch_content_info();

		// navbar and output
		$navbits = array();

		$foruminfo = fetch_foruminfo($contentinfo['forumid']);
		$parentlist = array_reverse(explode(',', substr($foruminfo['parentlist'], 0, -3)));
		foreach ($parentlist AS $forumID)
		{
			$forumTitle = $this->registry->forumcache[$forumID]['title'];
			$navbits[fetch_seo_url('forum', array('forumid' => $forumID, 'title' => $forumTitle))] = $forumTitle;
		}
		$navbits[fetch_seo_url('thread', $contentinfo)] = $contentinfo['prefix_plain_html'] . ' ' . $contentinfo['title'];

		$navbits[''] = $vbphrase['tag_management'];
		$navbits = construct_navbits($navbits);
		return $navbits;
	}


	public function verify_ui_permissions()
	{
		global $vbulletin;
		if (!$vbulletin->options['threadtagging'])
		{
			print_no_permission();
		}

		global $vbphrase;
		$threadinfo = $this->fetch_content_info();

		// *********************************************************************************
		// check for visible / deleted thread
		if (
			((!$threadinfo['visible'] AND !can_moderate($threadinfo['forumid'], 'canmoderateposts'))) OR
			($threadinfo['isdeleted'] AND !can_moderate($threadinfo['forumid']))
		)
		{
			eval(standard_error(fetch_error('invalidid', $vbphrase['thread'], $this->registry->options['contactuslink'])));
		}

		// *********************************************************************************
		// jump page if thread is actually a redirect
		if ($threadinfo['open'] == 10)
		{
			$destthreadinfo = fetch_threadinfo($threadinfo['pollid']);
			exec_header_redirect('thread|js', $destthreadinfo);
		}

		// *********************************************************************************
		// Tachy goes to coventry
		if (in_coventry($threadinfo['postuserid']) AND !can_moderate($threadinfo['forumid']))
		{
			eval(standard_error(fetch_error('invalidid', $vbphrase['thread'], $this->registry->options['contactuslink'])));
		}

		// *********************************************************************************
		// get forum info
		$foruminfo = fetch_foruminfo($threadinfo['forumid']);

		// *********************************************************************************
		// check forum permissions
		$forumperms = fetch_permissions($threadinfo['forumid']);
		if (!($forumperms & $this->registry->bf_ugp_forumpermissions['canview']) OR
			!($forumperms & $this->registry->bf_ugp_forumpermissions['canviewthreads'])
		)
		{
			print_no_permission();
		}
		if (!($forumperms & $this->registry->bf_ugp_forumpermissions['canviewothers']) AND
			($threadinfo['postuserid'] != $this->registry->userinfo['userid'] OR $this->registry->userinfo['userid'] == 0)
		)
		{
			print_no_permission();
		}

		// *********************************************************************************
		// check if there is a forum password and if so, ensure the user has it set
		verify_forum_password($foruminfo['forumid'], $foruminfo['password']);
//		return $show;
	}
}

/*======================================================================*\
|| ####################################################################
|| # CVS: $RCSfile$ - $Revision: 27657 $
|| ####################################################################
\*======================================================================*/