Файл: IPBMafia.ru_IPB_3.4.6_Final_Rus _Nulled/board/upload/interface/board/modules/ipb/api.php
Строк: 479
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Remote API Server
* Last Updated: $Date: 2013-03-21 17:38:09 -0400 (Thu, 21 Mar 2013) $
* </pre>
*
* @author $Author: AndyMillne $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 12109 $
*
*/
class API_Server
{
/**
* Defines the service for WSDL
*
* @var array
*/
public $__dispatch_map = array();
/**
* IPS Global Class
*
* @var object
*/
protected $registry;
/**
* IPS API SERVER Class
*
* @var object
*/
public $classApiServer;
/**
* Constructor
*
* @return @e void
*/
public function __construct( $registry )
{
//-----------------------------------------
// Set IPS CLASS
//-----------------------------------------
$this->registry = $registry;
//-----------------------------------------
// Load allowed methods and build dispatch
// list
//-----------------------------------------
$ALLOWED_METHODS = array();
require_once( DOC_IPS_ROOT_PATH . 'interface/board/modules/ipb/methods.php' );/*noLibHook*/
if ( is_array( $ALLOWED_METHODS ) and count( $ALLOWED_METHODS ) )
{
foreach( $ALLOWED_METHODS as $_method => $_data )
{
$this->__dispatch_map[ $_method ] = $_data;
}
}
}
/**
* Returns the list of online users
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $sep_character Separator character
* @return string xml
*/
public function fetchOnlineUsers( $api_key, $api_module, $sep_character=',' )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'fetchOnlineUsers' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
if ( !ipsRegistry::$settings['au_cutoff'] )
{
ipsRegistry::$settings[ 'au_cutoff'] = 15 ;
}
$cut_off = ipsRegistry::$settings['au_cutoff'] * 60;
$time = time() - $cut_off;
$rows = array();
$ar_time = time();
$this->registry->DB()->build( array( 'select' => '*',
'from' => 'sessions',
'where' => "running_time > {$time}" ) );
$this->registry->DB()->execute();
//-----------------------------------------
// FETCH...
//-----------------------------------------
while ( $r = $this->registry->DB()->fetch() )
{
$rows[ $r['running_time'].'.'.$r['id'] ] = $r;
}
krsort( $rows );
//-----------------------------------------
// cache all printed members so we
// don't double print them
//-----------------------------------------
$cached = array();
foreach ( $rows as $result )
{
$last_date = ipsRegistry::getClass( 'class_localization')->getTime( $result['running_time'] );
//-----------------------------------------
// Bot?
//-----------------------------------------
if ( isset( $result['uagent_type'] ) && $result['uagent_type'] == 'search' )
{
//-----------------------------------------
// Seen bot of this type yet?
//-----------------------------------------
if ( ! $cached[ $result['member_name'] ] )
{
$active['NAMES'][] = $result['member_name'];
$cached[ $result['member_name'] ] = 1;
}
else
{
//-----------------------------------------
// Yup, count others as guest
//-----------------------------------------
$active['GUESTS']++;
}
}
//-----------------------------------------
// Guest?
//-----------------------------------------
else if ( ! $result['member_id'] OR ! $result['member_name'] )
{
$active['GUESTS']++;
}
//-----------------------------------------
// Member?
//-----------------------------------------
else
{
if ( empty( $cached[ $result['member_id'] ] ) )
{
$cached[ $result['member_id'] ] = 1;
$result['member_name'] = IPSMember::makeNameFormatted( $result['member_name'], $result['member_group'] );
/* Reset login type in case the board/group setting got changed */
$result['login_type'] = IPSMember::isLoggedInAnon( array( 'login_anonymous' => $result['login_type'] ), $result['member_group'] );
if ( $result['login_type'] )
{
if ( $this->registry->member()->getProperty('g_access_cp') )
{
$active['NAMES'][] = "<a href='" . $this->registry->getClass('output')->buildSEOUrl( "showuser={$result['member_id']}", 'public', $result['seo_name'], 'showuser' ) . "' title='$last_date'>{$result['member_name']}</a>*";
$active['ANON']++;
}
else
{
$active['ANON']++;
}
}
else
{
$active['MEMBERS']++;
$active['NAMES'][] = "<a href='" . $this->registry->getClass('output')->buildSEOUrl( "showuser={$result['member_id']}", 'public', $result['seo_name'], 'showuser' ) ."' title='$last_date'>{$result['member_name']}</a>";
}
}
}
}
$active['TOTAL'] = $active['MEMBERS'] + $active['GUESTS'] + $active['ANON'];
//-----------------------------------------
// Return info
//-----------------------------------------
$this->classApiServer->apiSendReply( $active );
exit();
}
}
/**
* Returns details about the board
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @return string xml
*/
public function fetchStats( $api_key, $api_module )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'fetchStats' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
$stats = $this->registry->cache()->getCache('stats');
$most_time = ipsRegistry::getClass('class_localization')->getDate( $stats['most_date'], 'LONG' );
$most_count = ipsRegistry::getClass('class_localization')->formatNumber( $stats['most_count'] );
$total_posts = $stats['total_topics'] + $stats['total_replies'];
$total_posts = ipsRegistry::getClass('class_localization')->formatNumber($total_posts);
$mem_count = ipsRegistry::getClass('class_localization')->formatNumber($stats['mem_count']);
$mem_last_id = $stats['last_mem_id'];
$mem_last_name = $stats['last_mem_name'];
//-----------------------------------------
// Return info
//-----------------------------------------
$this->classApiServer->apiSendReply( array( 'users_most_online' => $most_count,
'users_most_date_formatted' => $most_time,
'users_most_data_unix' => $stats['most_date'],
'total_posts' => $total_posts,
'total_members' => $mem_count,
'last_member_id' => $mem_last_id,
'last_member_name' => $mem_last_name ) );
exit();
}
}
/**
* Returns hello board test
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @return string xml
*/
public function helloBoard( $api_key, $api_module )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'helloBoard' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Upgrade history?
//-----------------------------------------
$latest_version = array( 'upgrade_version_id' => NULL );
$this->registry->DB()->build( array( 'select' => '*', 'from' => 'upgrade_history', 'where' => "upgrade_app='core'", 'order' => 'upgrade_version_id DESC', 'limit' => array(1) ) );
$this->registry->DB()->execute();
while( $r = $this->registry->DB()->fetch() )
{
$latest_version = $r;
}
//-----------------------------------------
// Return info
//-----------------------------------------
$this->classApiServer->apiSendReply( array( 'board_name' => ipsRegistry::$settings['board_name'],
'upload_url' => ipsRegistry::$settings['upload_url'],
'ipb_img_url' => ipsRegistry::$settings['ipb_img_url'],
'board_human_version' => $latest_version['upgrade_version_human'],
'board_long_version' => !empty($latest_version['upgrade_notes']) ? $latest_version['upgrade_notes'] : ipsRegistry::$vn_full ) );
exit();
}
}
/**
* Posts a topic to the board remotely
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $member_field Member field to check (valid: "id", "email", "username", "displayname")
* @param string $member_key Member key to check for
* @param integer $forum_id Forum id to post in
* @param string $topic_title Topic title
* @param string $post_content Posted content
* @return string xml
*/
public function postTopic( $api_key, $api_module, $member_field, $member_key, $forum_id, $topic_title, $post_content )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
$member_field = IPSText::parseCleanValue( $member_field );
$member_key = IPSText::parseCleanValue( $member_key );
$topic_title = IPSText::parseCleanValue( $topic_title );
$forum_id = intval( $forum_id );
$UNCLEANED_post_content = $post_content;
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'postTopic' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Member field...
//-----------------------------------------
$member = IPSMember::load( $member_key, 'all', $member_field );
//-----------------------------------------
// Got a member?
//-----------------------------------------
if ( ! $member['member_id'] )
{
$this->classApiServer->apiSendError( '10', "IP.Board could not locate a member using $member_key / $member_field" );
}
//-----------------------------------------
// Get some classes
//-----------------------------------------
ipsRegistry::getAppClass( 'forums' );
require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php' );/*noLibHook*/
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPostForms.php', 'classPostForms', 'forums' );
$_postClass = new $classToLoad( $this->registry );
/* reset forum list to allow all access */
$this->registry->getClass('class_forums')->strip_invisible = false;
$this->registry->getClass('class_forums')->forumsInit();
//-----------------------------------------
// Set the data
//-----------------------------------------
$_postClass->setIsPreview( false );
$_postClass->setForumData( $this->registry->getClass('class_forums')->forum_by_id[ $forum_id ] );
$_postClass->setForumID( $forum_id );
$_postClass->setPostContent( $UNCLEANED_post_content );
$_postClass->setAuthor( $member['member_id'] );
$_postClass->setPublished( true );
$_postClass->setSettings( array( 'enableSignature' => 1,
'enableEmoticons' => 1,
'post_htmlstatus' => 0,
'enableTracker' => 0 ) );
$_postClass->setTopicTitle( $topic_title );
# Switch off perm checks
$_postClass->setBypassPermissionCheck(true);
/**
* And post it...
*/
try
{
if ( $_postClass->addTopic() === FALSE )
{
$this->classApiServer->apiSendError( '10', "IP.Board could not post the topic: " . $_postClass->getPostError() );
}
}
catch( Exception $error )
{
$this->classApiServer->apiSendError( '10', "IP.Board post class exception: " . $error->getMessage() );
}
$this->classApiServer->apiSendReply( array(
'result' => 'success',
'topic_id' => $_postClass->getTopicData('tid')
) );
exit();
}
}
/**
* Posts a topic reply
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $member_field Member field to check (valid: "id", "email", "username", "displayname")
* @param string $member_key Member key to check for
* @param integer $topic_id Topic id to post in
* @param string $post_content Posted content
* @return string xml
*/
public function postReply( $api_key, $api_module, $member_field, $member_key, $topic_id, $post_content )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
$member_field = IPSText::parseCleanValue( $member_field );
$member_key = IPSText::parseCleanValue( $member_key );
$topic_id = intval( $topic_id );
$UNCLEANED_post_content = $post_content;
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'postReply' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Member field...
//-----------------------------------------
$member = IPSMember::load( $member_key, 'all', $member_field );
//-----------------------------------------
// Got a member?
//-----------------------------------------
if ( ! $member['member_id'] )
{
$this->classApiServer->apiSendError( '10', "IP.Board could not locate a member using $member_key / $member_field" );
}
//-----------------------------------------
// Get some classes
//-----------------------------------------
ipsRegistry::getAppClass( 'forums' );
require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPost.php' );/*noLibHook*/
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . '/sources/classes/post/classPostForms.php', 'classPostForms', 'forums' );
$_postClass = new $classToLoad( $this->registry );
/* reset forum list to allow all access */
$this->registry->getClass('class_forums')->strip_invisible = false;
$this->registry->getClass('class_forums')->forumsInit();
//-----------------------------------------
// Need the topic...
//-----------------------------------------
$topic = $this->registry->DB()->buildAndFetch( array( 'select' => '*', 'from' => 'topics', 'where' => 'tid=' . $topic_id ) );
//-----------------------------------------
// Set the data
//-----------------------------------------
$_postClass->setIsPreview( false );
$_postClass->setForumData( $this->registry->getClass('class_forums')->forum_by_id[ $topic['forum_id'] ] );
$_postClass->setForumID( $topic['forum_id'] );
$_postClass->setTopicID( $topic_id );
$_postClass->setTopicData( $topic );
$_postClass->setPostContent( $UNCLEANED_post_content );
$_postClass->setAuthor( $member['member_id'] );
$_postClass->setPublished( true );
$_postClass->setSettings( array( 'enableSignature' => 1,
'enableEmoticons' => 1,
'post_htmlstatus' => 0,
'enableTracker' => 0 ) );
/**
* And post it...
*/
try
{
if ( $_postClass->addReply() === FALSE )
{
//print $_postClass->_postErrors;
$this->classApiServer->apiSendError( '10', "IP.Board could not add the reply " . $_postClass->_postErrors );
}
}
catch( Exception $error )
{
$this->classApiServer->apiSendError( '10', "IP.Board post class exception: " . $error->getMessage() );
}
$this->classApiServer->apiSendReply( array( 'result' => 'success' ) );
exit();
}
}
/**
* Returns a member
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $search_type Member field to check (valid: "id", "email", "username", "displayname")
* @param string $search_string String to search for
* @return string xml
*/
public function fetchMember( $api_key, $api_module, $search_type, $search_string )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
$search_type = IPSText::parseCleanValue( $search_type );
$search_string = IPSText::parseCleanValue( $search_string );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'fetchMember' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Fetch forum list
//-----------------------------------------
$member = IPSMember::load( $search_string, 'all', $search_type );
if ( ! $member['member_id'] )
{
$member = array( 'member_id' => 0 );
}
//-----------------------------------------
// Return the data
//-----------------------------------------
$this->classApiServer->apiSendReply( $member );
exit();
}
}
/**
* Check if a member exists
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $search_type Member field to check (valid: "id", "email", "username", "displayname")
* @param string $search_string String to search for
* @return string xml
*/
public function checkMemberExists( $api_key, $api_module, $search_type, $search_string )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
$search_type = IPSText::parseCleanValue( $search_type );
$search_string = IPSText::parseCleanValue( $search_string );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'checkMemberExists' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
$member = IPSMember::load( $search_string, 'all', $search_type );
//-----------------------------------------
// Return the data
//-----------------------------------------
$this->classApiServer->apiSendReply( array( 'memberExists' => $member['member_id'] ? true : false ) );
exit();
}
}
/**
* Fetch the forum options list.
* WARNING: Last two options are deprecated and no longer supported. All viewable forums returned. User is automatically treated like a guest.
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $selected_forum_ids Comma separated list of forum ids
* @param bool $view_as_guest Treat user as a guest
* @return string xml
*/
public function fetchForumsOptionList( $api_key, $api_module, $selected_forum_ids, $view_as_guest )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'fetchForumsOptionList' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Get some classes
//-----------------------------------------
ipsRegistry::getAppClass( 'forums' );
//-----------------------------------------
// Fetch forum list
//-----------------------------------------
$list = $this->registry->getClass('class_forums')->forumsForumJump();
//-----------------------------------------
// Return the data
//-----------------------------------------
$this->classApiServer->apiSendReply( array( 'forumList' => $list ) );
exit();
}
}
/**
* Returns the board's forums.
* WARNING: Last option is deprecated and no longer supported. User is automatically treated like a guest.
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $forum_ids Comma separated list of forum ids
* @param bool $view_as_guest Treat user as a guest
* @return string xml
*/
public function fetchForums( $api_key, $api_module, $forum_ids, $view_as_guest )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
$forum_ids = ( $forum_ids ) ? explode( ',', IPSText::parseCleanValue( $forum_ids ) ) : null;
$view_as_guest = intval( $view_as_guest );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'fetchForums' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Get some classes
//-----------------------------------------
ipsRegistry::getAppClass( 'forums' );
//-----------------------------------------
// Fetch forum list
//-----------------------------------------
$return = array();
foreach( $forum_ids as $id )
{
$return[] = $this->registry->getClass('class_forums')->forumsFetchData( $id );
}
//-----------------------------------------
// Return the data
//-----------------------------------------
$this->classApiServer->apiSendReply( $return );
exit();
}
}
/**
* Returns topics based on request params
*
* @param string $api_key Authentication Key
* @param string $api_module Module
* @param string $forum_ids Comma separated list of forum ids
* @param string $order_field DB field to order by
* @param string $order_by One of "asc" or "desc"
* @param integer $offset Start point offset for results
* @param integer $limit Number of results to pull
* @param bool $view_as_guest Treat user as a guest
* @return string xml
*/
public function fetchTopics( $api_key, $api_module, $forum_ids, $order_field, $order_by, $offset, $limit, $view_as_guest, $parse_display )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$api_key = IPSText::md5Clean( $api_key );
$api_module = IPSText::parseCleanValue( $api_module );
$forum_ids = IPSText::parseCleanValue( $forum_ids );
$order_field = IPSText::parseCleanValue( $order_field );
$order_by = ( strtolower( $order_by ) == 'asc' ) ? 'asc' : 'desc';
$offset = intval( $offset );
$limit = intval( $limit );
$view_as_guest = intval( $view_as_guest );
$parse_display = intval( $parse_display );
//-----------------------------------------
// Authenticate
//-----------------------------------------
if ( $this->__authenticate( $api_key, $api_module, 'fetchTopics' ) !== FALSE )
{
//-----------------------------------------
// Add log
//-----------------------------------------
$this->addLogging( $api_key );
//-----------------------------------------
// Get API classes
//-----------------------------------------
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . '/api/forums/api_topic_view.php', 'apiTopicView' );
$topic_view = new $classToLoad();
//-----------------------------------------
// Fetch topic list
//-----------------------------------------
$topic_view->topic_list_config['order_field'] = $order_field;
$topic_view->topic_list_config['order_by'] = $order_by;
$topic_view->topic_list_config['forums'] = $forum_ids;
$topic_view->topic_list_config['offset'] = $offset;
$topic_view->topic_list_config['limit'] = $limit;
$topics = $topic_view->return_topic_list_data( $view_as_guest, $parse_display );
//-----------------------------------------
// Return the data
//-----------------------------------------
$this->classApiServer->apiSendReply( $topics );
exit();
}
}
/**
* Adds logging obviously :)
*
* @param string $api_key Authentication Key
*/
public function addLogging( $api_key )
{
if ( ipsRegistry::$settings['xmlrpc_log_type'] != 'failed' )
{
$this->registry->DB()->insert( 'api_log', array( 'api_log_key' => $api_key,
'api_log_ip' => $_SERVER['REMOTE_ADDR'],
'api_log_date' => time(),
'api_log_query' => $this->classApiServer->raw_request,
'api_log_allowed' => 1 ) );
}
}
/**
* Checks to see if the request is allowed
*
* @param string $api_key Authenticate Key
* @param string $api_module Module
* @param string $api_function Function
* @return string Error message, if any
*/
protected function __authenticate( $api_key, $api_module, $api_function )
{
//-----------------------------------------
// Check
//-----------------------------------------
if ( $this->api_user['api_user_id'] )
{
$this->api_user['_permissions'] = unserialize( stripslashes( $this->api_user['api_user_perms'] ) );
if ( $this->api_user['_permissions'][ $api_module ][ $api_function ] == 1 )
{
return TRUE;
}
else
{
$this->registry->DB()->insert( 'api_log', array( 'api_log_key' => $api_key,
'api_log_ip' => $_SERVER['REMOTE_ADDR'],
'api_log_date' => time(),
'api_log_query' => $this->classApiServer->raw_request,
'api_log_allowed' => 0 ) );
$this->classApiServer->apiSendError( '200', "API Key {$api_key} does not have permission for {$api_module}/{$api_function}" );
return FALSE;
}
}
else
{
$this->registry->DB()->insert( 'api_log', array( 'api_log_key' => $api_key,
'api_log_ip' => $_SERVER['REMOTE_ADDR'],
'api_log_date' => time(),
'api_log_query' => $this->classApiServer->raw_request,
'api_log_allowed' => 0 ) );
$this->classApiServer->apiSendError( '100', "API Key {$api_key} does not have permission for {$api_module}/{$api_function}" );
return FALSE;
}
}
}