Файл: admin/applications/forums/extensions/coreExtensions.php
Строк: 483
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Forum permissions mappings
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $author$
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @subpackage Forums
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*/
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
exit();
}
/**
* Class name must be (app)ShareLinks
*/
class forumsShareLinks
{
/**
* Shortcuts
*
* @var object
*/
protected $DB;
protected $registry;
/**
* Constructor
*
* @return @e void
*/
public function __construct()
{
$this->DB = ipsRegistry::DB();
$this->registry = ipsRegistry::instance();
}
/**
* Deconstruct the URL
*
* An array of URL bits are passed ( array( 'showtopic' => 100, 'pid' => '123' ) ).
* This function should attempt to return formatted data:
*
*
* array( 'data_app' => '',
* 'data_type' => '',
* 'data_primary_id' => 0,
* 'data_secondary_id' => 0 )
*
* log_data_app MUST be set if you find a match. Leave blank to confirm no match
*
* @param array
* @return array
*/
public function deconstructUrl( $url )
{
$ret = array( 'data_app' => '',
'data_type' => '',
'data_primary_id' => 0,
'data_secondary_id' => 0 );
if ( is_array( $url ) AND count( $url ) )
{
if ( isset( $url['showtopic'] ) )
{
$ret['data_app'] = 'forums';
$ret['data_type'] = 'topic';
$ret['data_primary_id'] = $url['showtopic'];
}
else if ( $url['module'] == 'forums' AND $url['section'] == 'topics' )
{
$ret['data_app'] = 'forums';
$ret['data_type'] = 'topic';
$ret['data_primary_id'] = $url['tid'];
}
}
return $ret;
}
/**
* Process links data
*
* Array will be $key => array( log_data_app =>, log_data_type =>, log_data_primary_id =>, )
*
* MUST be returned:
* $key => array( 'title' => 'My Great Topic',
* 'url' => URL, SEO where appropriate,
* 'published' => unix time stamp,
* 'icon' => icon relative to /style_images/master (16x16 icon)
*
* @param array
* @return array
*/
public function processData( $array )
{
$topics = array();
$final = array();
$return = array();
/* Ensure forums class is loaded */
if ( ! $this->registry->isClassLoaded('class_forums') )
{
try
{
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/class_forums.php", 'class_forums', 'forums' );
$this->registry->setClass( 'class_forums', new $classToLoad( $this->registry ) );
$this->registry->getClass('class_forums')->strip_invisible = 1;
$this->registry->getClass('class_forums')->forumsInit();
}
catch( Exception $error )
{
IPS_exception_error( $error );
}
}
/* Here we go again */
if ( is_array( $array ) and count( $array ) )
{
foreach( $array as $key => $data )
{
if ( $data['log_data_type'] == 'topic' )
{
$topics[] = intval( $data['log_data_primary_id'] );
}
}
if ( count( $topics ) )
{
$this->DB->build( array( 'select' => 'tid, title, title_seo, start_date, forum_id',
'from' => 'topics',
'where' => 'tid IN (' . implode( ',', $topics ) . ')' ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
/* Quick permission check */
if ( ! $this->registry->getClass('class_forums')->forumsCheckAccess( $row['forum_id'], 0, 'forum', $row, true ) )
{
$url = $this->registry->output->buildUrl( 'showtopic='. $row['tid'], 'publicNoSession' );
$title = 'Protected Topic';
}
else
{
$url = $this->registry->output->buildSEOUrl( 'showtopic='. $row['tid'], 'publicNoSession', $row['title_seo'], 'showtopic' );
$title = $row['title'];
}
$final[ $row['tid'] ] = array( 'title' => $title,
'url' => $url,
'published' => $row['start_date'],
'icon' => 'page_topic.png' );
}
}
/* Sigh */
if ( is_array( $final ) )
{
foreach( $array as $key => $data )
{
$return[ $key ] = isset($final[ $data['log_data_primary_id'] ]) ? $final[ $data['log_data_primary_id'] ] : array();
}
return $return;
}
return array();
}
return array();
}
/**
* Process links data
*
* Array will be array( data_app =>, data_type =>, data_primary_id =>, )
*
* Return TRUE for permission OK, FALSE for no permission
*
* @param array
* @return array
*/
public function permissionCheck( $array )
{
/* Ensure forums class is loaded */
if ( ! $this->registry->isClassLoaded('class_forums') )
{
try
{
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/class_forums.php", 'class_forums', 'forums' );
$this->registry->setClass( 'class_forums', new $classToLoad( $this->registry ) );
$this->registry->getClass('class_forums')->strip_invisible = 1;
$this->registry->getClass('class_forums')->forumsInit();
}
catch( Exception $error )
{
IPS_exception_error( $error );
}
}
/* Quick permission check */
if ( $array['data_type'] == 'topic' )
{
$topic = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'topics',
'where' => 'tid=' . intval( $array['data_primary_id'] ) ) );
if ( $this->registry->getClass('class_forums')->forumsCheckAccess( $topic['forum_id'], 0, 'forum', $topic, true ) )
{
return TRUE;
}
}
return FALSE;
}
}
$_PERM_CONFIG = array( 'Forum' );
class forumsPermMappingForum
{
/**
* Mapping of keys to columns
*
* @var array
*/
protected $mapping = array(
'view' => 'perm_view',
'read' => 'perm_2',
'reply' => 'perm_3',
'start' => 'perm_4',
'upload' => 'perm_5',
'download' => 'perm_6'
);
/**
* Mapping of keys to names
*
* @var array
*/
protected $perm_names = array(
'view' => 'Show Forum',
'read' => 'Read Topics',
'reply' => 'Reply Topics',
'start' => 'Start Topics',
'upload' => 'Upload',
'download' => 'Download',
);
/**
* Mapping of keys to background colors for the form
*
* @var array
*/
protected $perm_colors = array(
'view' => '#fff0f2',
'read' => '#effff6',
'reply' => '#edfaff',
'start' => '#f0f1ff',
'upload' => '#fffaee',
'download' => '#ffeef9',
);
/**
* Method to pull the key/column mapping
*
* @return array
*/
public function getMapping()
{
return $this->mapping;
}
/**
* Method to pull the key/name mapping
*
* @return array
*/
public function getPermNames()
{
return $this->perm_names;
}
/**
* Method to pull the key/color mapping
*
* @return array
*/
public function getPermColors()
{
return $this->perm_colors;
}
/**
* Retrieve the permission items
*
* @return array
*/
public function getPermItems()
{
require_once( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/class_forums.php" );/*noLibHook*/
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/admin_forum_functions.php", 'admin_forum_functions', 'forums' );
$forumfunc = new $classToLoad( ipsRegistry::instance() );
$forumfunc->forumsInit();
$forum_data = $forumfunc->adForumsForumData();
$return_arr = array();
foreach( $forum_data as $r )
{
$return_arr[$r['id']] = array(
'title' => $r['depthed_name'],
'perm_view' => $r['perm_view'],
'perm_2' => $r['perm_2'],
'perm_3' => $r['perm_3'],
'perm_4' => $r['perm_4'],
'perm_5' => $r['perm_5'],
'perm_6' => $r['perm_6'],
'perm_7' => $r['perm_7'],
'restrict' => $r['parent_id'] == 'root' ? 'perm_view' : '',
);
}
return $return_arr;
}
}
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Item Marking
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @subpackage Forums
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*/
class itemMarking__forums
{
/**
* Field Convert Data Remap Array
*
* This is where you can map your app_key_# numbers to application savvy fields
*
* @var array
*/
protected $_convertData = array( 'forumID' => 'item_app_key_1' );
/**#@+
* Registry Object Shortcuts
*
* @var object
*/
protected $registry;
protected $DB;
protected $settings;
protected $request;
protected $lang;
protected $member;
protected $memberData;
protected $cache;
protected $caches;
/**#@-*/
/**
* I'm a constructor, twisted constructor
*
* @param object ipsRegistry reference
* @return @e void
*/
public function __construct( ipsRegistry $registry )
{
/* Make objects */
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->lang = $this->registry->getClass('class_localization');
$this->member = $this->registry->member();
$this->memberData =& $this->registry->member()->fetchMemberData();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
}
/**
* Convert Data
* Takes an array of app specific data and remaps it to the DB table fields
*
* @param array
* @return array
*/
public function convertData( $data )
{
$_data = array();
foreach( $data as $k => $v )
{
if ( isset($this->_convertData[$k]) )
{
# Make sure we use intval here as all 'forum' app fields
# are integers.
$_data[ $this->_convertData[ $k ] ] = intval( $v );
}
else
{
$_data[ $k ] = $v;
}
}
return $_data;
}
/**
* Determines whether to load all markers for this view or not
*
* @return bool
*/
public function loadAllMarkers()
{
if ( ! empty( $this->request['showtopic'] ) )
{
return false;
}
if ( ! empty( $this->request['showforum'] ) )
{
return false;
}
return true;
}
/**
* Fetch unread count
*
* Grab the number of items truly unread
* This is called upon by 'markRead' when the number of items
* left hits zero (or less).
*
*
* @param array Array of data
* @param array Array of read itemIDs
* @param int Last global reset
* @return integer Last unread count
*/
public function fetchUnreadCount( $data, $readItems, $lastReset )
{
$count = 0;
$lastItem = 0;
$approved = $this->memberData['is_mod'] ? ' AND ' . $this->registry->getClass('class_forums')->fetchTopicHiddenQuery( array( 'visible', 'hidden' ), '' ) . ' ' : ' AND ' . $this->registry->getClass('class_forums')->fetchTopicHiddenQuery( array( 'visible' ), '' ) . ' ';
$readItems = is_array( $readItems ) ? $readItems : array( 0 );
if ( $data['forumID'] )
{
$_count = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as cnt, MIN(last_post) as lastItem',
'from' => 'topics',
'where' => "forum_id=" . intval( $data['forumID'] ) . " {$approved} AND tid NOT IN(".implode(",",array_keys($readItems)).") AND last_post > ".intval($lastReset) . " AND state != 'link'" ) );
$count = intval( $_count['cnt'] );
$lastItem = intval( $_count['lastItem'] );
}
return array( 'count' => $count,
'lastItem' => $lastItem );
}
}
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Fetch Skin
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @subpackage Forums
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*/
class fetchSkin__forums
{
/**#@+
* Registry Object Shortcuts
*
* @var object
*/
protected $registry;
protected $DB;
protected $settings;
protected $request;
protected $lang;
protected $member;
protected $memberData;
protected $cache;
protected $caches;
/**#@-*/
/**
* I'm a constructor, twisted constructor
*
* @param object ipsRegistry reference
* @return @e void
*/
public function __construct( ipsRegistry $registry )
{
/* Make objects */
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->lang = $this->registry->getClass('class_localization');
$this->member = $this->registry->member();
$this->memberData =& $this->registry->member()->fetchMemberData();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
/* Check for class_forums */
if( ipsRegistry::isClassLoaded('class_forums') !== TRUE )
{
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/class_forums.php", 'class_forums', 'forums' );
$this->registry->setClass( 'class_forums', new $classToLoad( $registry ) );
$this->registry->class_forums->forumsInit();
}
}
/**
* Returns a skin ID or FALSE
*
* @author Matt Mecham
* @return mixed INT or FALSE if no skin found / required
*/
public function fetchSkin()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$useSkinID = FALSE;
$_keys = array_keys( $_REQUEST );
//-----------------------------------------
// OK, viewing a forum or WHAT?
//-----------------------------------------
if ( count( array_intersect( array( 'showtopic', 'showforum' ), $_keys ) ) OR ( $this->request['module'] == 'post' ) )
{
$cache = $this->registry->class_forums->forum_by_id;
$eff = intval( $this->request['f'] );
//-----------------------------------------
// Do we have a skin for a particular forum?
//-----------------------------------------
if ( $eff )
{
if ( !empty( $cache[ $eff ]['skin_id'] ) )
{
$useSkinID = $cache[ $eff ]['skin_id'];
}
}
}
return $useSkinID;
}
}
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Library: Handle public session data
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @subpackage Forums
* @link http://www.invisionpower.com
* @since 12th March 2002
* @version $Revision: 10721 $
*/
class publicSessions__forums
{
/**
* Return session variables for this application
*
* current_appcomponent, current_module and current_section are automatically
* stored. This function allows you to add specific variables in.
*
* @author Matt Mecham
* @return array
*/
public function getSessionVariables()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$array = array( 'location_1_type' => '',
'location_1_id' => 0,
'location_2_type' => '',
'location_2_id' => 0 );
//-----------------------------------------
// FORUM
//-----------------------------------------
if ( ipsRegistry::$request['module'] == 'forums' AND !empty( ipsRegistry::$request['f'] ) )
{
$array = array(
'location_2_type' => 'forum',
'location_2_id' => intval(ipsRegistry::$request['f']) );
}
//-----------------------------------------
// TOPIC
//-----------------------------------------
else if ( ipsRegistry::$request['module'] == 'forums' AND ipsRegistry::$request['section'] == 'topics' AND !empty( ipsRegistry::$request['t'] ) )
{
$array = array(
'location_1_type' => 'topic',
'location_1_id' => intval(ipsRegistry::$request['t']),
'location_2_type' => 'forum',
'location_2_id' => intval(ipsRegistry::$request['f']) );
}
//-----------------------------------------
// POST
//-----------------------------------------
else if ( ipsRegistry::$request['module'] == 'post' AND !empty( ipsRegistry::$request['f'] ) )
{
$array = array(
'location_1_type' => 'topic',
'location_1_id' => intval(ipsRegistry::$request['t']),
'location_2_type' => 'forum',
'location_2_id' => intval(ipsRegistry::$request['f']) );
}
return $array;
}
/**
* Parse/format the online list data for the records
*
* @author Brandon Farber
* @param array Online list rows to check against
* @return array Online list rows parsed
*/
public function parseOnlineEntries( $rows )
{
if( !is_array($rows) OR !count($rows) )
{
return $rows;
}
//-----------------------------------------
// Init
//-----------------------------------------
$forums_raw = array();
$forums = array();
$topics_raw = array();
$topics = array();
$posts_raw = array();
$posts = array();
$final = array();
//-----------------------------------------
// Extract the topic/forum data
//-----------------------------------------
foreach( $rows as $row )
{
if( $row['current_appcomponent'] != 'forums' OR !$row['current_module'] )
{
continue;
}
if( $row['current_section'] == 'forums' )
{
$forums_raw[ $row['location_2_id'] ] = '';
}
else if( $row['current_section'] == 'topics' )
{
$topics_raw[ $row['location_1_id'] ] = $row['location_1_id'];
}
else if( $row['current_section'] == 'post' )
{
$forums_raw[ $row['location_2_id'] ] = '';
$topics_raw[ $row['location_1_id'] ] = $row['location_1_id'];
}
}
//-----------------------------------------
// Get the forums, if you dare
//-----------------------------------------
ipsRegistry::getAppClass('forums');
if( count($forums_raw) )
{
foreach( ipsRegistry::getClass('class_forums')->forum_by_id as $fid => $forum )
{
if( isset($forums_raw[$fid]) )
{
if( ipsRegistry::getClass( 'permissions' )->check( 'view', $forum ) !== false )
{
$forums[ $fid ] = $forum['name'];
}
}
}
}
//-----------------------------------------
// Get the topics, if you care
//-----------------------------------------
if( count($topics_raw) )
{
$_approved = ipsRegistry::getClass('class_forums')->fetchTopicHiddenQuery( array( 'visible' ), 't.' );
ipsRegistry::DB()->build( array( 'select' => 't.*',
'from' => array( 'topics' => 't' ),
'where' => $_approved . ' AND t.tid IN(' . implode( ',', $topics_raw ) . ') AND ' . ipsRegistry::getClass('permissions')->buildPermQuery('p'),
'add_join' => array(
array(
'from' => array( 'permission_index' => 'p' ),
'where' => "p.perm_type_id=t.forum_id AND p.app='forums' AND p.perm_type='forum'",
'type' => 'left',
),
)
) );
$tr = ipsRegistry::DB()->execute();
while( $r = ipsRegistry::DB()->fetch($tr) )
{
$_forum = ipsRegistry::getClass('class_forums')->getForumByid( $r['forum_id'] );
if( count( $_forum ) AND ipsRegistry::getClass('class_forums')->forumsCheckAccess( $_forum['id'], false, 'topic', $r, true ) )
{
if( ipsRegistry::getClass( 'permissions' )->check( 'read', $_forum ) !== false )
{
if ( $_forum['password'] == '' or IPSMember::isInGroup( ipsRegistry::member()->fetchMemberData(), explode( ',', $_forum['password_override'] ) ) or IPSCookie::get( "ipbforumpass_{$_forum['id']}" ) == md5( $_forum['password'] ) )
{
$topics[ $r['tid'] ] = $r['title'];
}
}
}
}
}
//-----------------------------------------
// Put humpty dumpty together again
//-----------------------------------------
foreach( $rows as $row )
{
if( $row['current_appcomponent'] != 'forums' )
{
$final[ $row['id'] ] = $row;
continue;
}
if( !$row['current_module'] )
{
$row['where_line'] = ipsRegistry::getClass( 'class_localization' )->words['board_index'];
$final[ $row['id'] ] = $row;
continue;
}
if( $row['current_section'] == 'forums' )
{
if( isset($forums[ $row['location_2_id'] ]) )
{
$row['where_line'] = ipsRegistry::getClass( 'class_localization' )->words['WHERE_sf'];
$row['where_line_more'] = $forums[ $row['location_2_id'] ];
$row['where_link'] = 'showforum=' . $row['location_2_id'];
$row['_whereLinkSeo'] = ipsRegistry::getClass('output')->formatUrl( ipsRegistry::getClass('output')->buildUrl( "showforum=".$row['location_2_id'], 'public' ), IPSText::makeSeoTitle( $forums[ $row['location_2_id'] ] ), 'showforum' );
}
}
else if( $row['current_section'] == 'topics' )
{
if( isset($topics[ $row['location_1_id'] ]) )
{
$row['where_line'] = ipsRegistry::getClass( 'class_localization' )->words['WHERE_st'];
$row['where_line_more'] = $topics[ $row['location_1_id'] ];
$row['where_link'] = 'showtopic=' . $row['location_1_id'];
$row['_whereLinkSeo'] = ipsRegistry::getClass('output')->formatUrl( ipsRegistry::getClass('output')->buildUrl( "showtopic=".$row['location_1_id'], 'public' ), IPSText::makeSeoTitle( $topics[ $row['location_1_id'] ] ), 'showtopic' );
}
}
else if( $row['current_section'] == 'post' )
{
if( $row['location_1_id'] )
{
if( isset($topics[ $row['location_1_id'] ]) )
{
$row['where_line'] = ipsRegistry::getClass( 'class_localization' )->words['WHERE_postrep'];
$row['where_line_more'] = $topics[ $row['location_1_id'] ];
$row['where_link'] = 'showtopic=' . $row['location_1_id'];
$row['_whereLinkSeo'] = ipsRegistry::getClass('output')->formatUrl( ipsRegistry::getClass('output')->buildUrl( "showtopic=".$row['location_1_id'], 'public' ), IPSText::makeSeoTitle( $topics[ $row['location_1_id'] ] ), 'showtopic' );
}
}
else if( $row['location_2_id'] )
{
if( isset($forums[ $row['location_2_id'] ]) )
{
$row['where_line'] = ipsRegistry::getClass( 'class_localization' )->words['WHERE_postnew'];
$row['where_line_more'] = $forums[ $row['location_2_id'] ];
$row['where_link'] = 'showforum=' . $row['location_2_id'];
$row['_whereLinkSeo'] = ipsRegistry::getClass('output')->formatUrl( ipsRegistry::getClass('output')->buildUrl( "showforum=".$row['location_2_id'], 'public' ), IPSText::makeSeoTitle( $forums[ $row['location_2_id'] ] ), 'showforum' );
}
}
}
$final[ $row['id'] ] = $row;
}
return $final;
}
}