?
Path : /home/admin/domains/happytokorea.com/public_html_bk/test3/plugins/xmlrpc/ |
Current File : /home/admin/domains/happytokorea.com/public_html_bk/test3/plugins/xmlrpc/blogger.php |
<?php /** * @version $Id: blogger.php 14401 2010-01-26 14:10:00Z louis $ * @package Joomla * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved. * @license GNU/GPL, see LICENSE.php * Joomla! is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. * See COPYRIGHT.php for copyright notices and details. */ // no direct access defined( '_JEXEC' ) or die( 'Restricted access' ); jimport( 'joomla.plugin.plugin' ); class plgXMLRPCBlogger extends JPlugin { function plgXMLRPCBlogger(&$subject, $config) { parent::__construct($subject, $config); $this->loadLanguage( '', JPATH_ADMINISTRATOR ); } /** * @return array An array of associative arrays defining the available methods */ function onGetWebServices() { global $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; return array ( 'blogger.getUsersBlogs' => array( 'function' => 'plgXMLRPCBloggerServices::getUserBlogs', 'docstring' => JText::_('Returns a list of weblogs to which an author has posting privileges.'), 'signature' => array(array($xmlrpcArray, $xmlrpcString, $xmlrpcString, $xmlrpcString )) ), 'blogger.getUserInfo' => array( 'function' => 'plgXMLRPCBloggerServices::getUserInfo', 'docstring' => JText::_('Returns information about an author in the system.'), 'signature' => array(array($xmlrpcStruct, $xmlrpcString, $xmlrpcString, $xmlrpcString)) ), 'blogger.getPost' => array( 'function' => 'plgXMLRPCBloggerServices::getPost', 'docstring' => JText::_('Returns information about a specific post.'), 'signature' => array(array($xmlrpcStruct, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString)) ), 'blogger.getRecentPosts' => array( 'function' => 'plgXMLRPCBloggerServices::getRecentPosts', 'docstring' => JText::_('Returns a list of the most recent posts in the system.'), 'signature' => array(array($xmlrpcArray, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcInt)) ), 'blogger.getTemplate' => array( 'function' => 'plgXMLRPCBloggerServices::getTemplate', 'docstring' => '', 'signature' => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString)) ), 'blogger.setTemplate' => array( 'function' => 'plgXMLRPCBloggerServices::setTemplate', 'docstring' => '', 'signature' => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString)) ), 'blogger.newPost' => array( 'function' => 'plgXMLRPCBloggerServices::newPost', 'docstring' => JText::_('Creates a new post, and optionally publishes it.'), 'signature' => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcBoolean)) ), 'blogger.deletePost' => array( 'function' => 'plgXMLRPCBloggerServices::deletePost', 'docstring' => JText::_('Deletes a post.'), 'signature' => array(array($xmlrpcBoolean, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcBoolean)) ), 'blogger.editPost' => array( 'function' => 'plgXMLRPCBloggerServices::editPost', 'docstring' => JText::_('Updates the information about an existing post.'), 'signature' => array(array($xmlrpcBoolean, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcBoolean)) ) ); } } class plgXMLRPCBloggerServices { /* * Note : blogger.getUsersBlogs will make more sense once we support multiple blogs */ function getUserBlogs($appkey, $username, $password) { global $mainframe, $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); // Handle the access permissions part of the main database query if ($user->authorize('com_content', 'edit', 'content', 'all')) { $xwhere = ''; } else { $xwhere = ' AND a.published = 1 AND b.published = 1'; } $gid = $user->get('aid', 0); $access_check = ' AND a.access <= '.(int) $gid . ' AND b.access <= '.(int) $gid; // Query of categories within section $query = 'SELECT a.id, a.title, a.section, ' . ' CONCAT_WS(\'/\', a.title, b.title) AS catName' . ' FROM #__categories AS a' . ' LEFT JOIN #__sections AS b ON a.section = b.id' . $xwhere. $access_check; $db = &JFactory::getDBO(); $db->setQuery( $query ); $categories = $db->loadObjectList(); $structarray = array(); foreach( $categories AS $category ) { if (intval($category->section) > 0) { $blog = new xmlrpcval(array( 'url' => new xmlrpcval(JURI::base(), $xmlrpcString), 'blogid' => new xmlrpcval($category->id, $xmlrpcString), 'blogName' => new xmlrpcval($category->catName, $xmlrpcString) ), 'struct'); array_push($structarray, $blog); } } return new xmlrpcresp(new xmlrpcval( $structarray , $xmlrpcArray)); } function getUserInfo($appkey, $username, $password) { global $xmlrpcerruser, $xmlrpcStruct; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); $struct = new xmlrpcval( array( 'nickname' => new xmlrpcval($user->get('username')), 'userid' => new xmlrpcval($user->get('id')), 'url' => new xmlrpcval(''), 'email' => new xmlrpcval($user->get('email')), 'lastname' => new xmlrpcval($user->get('name')), 'firstname' => new xmlrpcval($user->get('name')) ), $xmlrpcStruct); return new xmlrpcresp($struct); } function getPost($appkey, $postid, $username, $password) { global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); $db = &JFactory::getDBO(); $where = 'a.id = ' . (int) $postid; $canReadUnpublished = $user->authorize('com_content', 'edit', 'content', 'all'); if ($canReadUnpublished) { $publishedWhere = ''; } else { $publishedWhere = ' AND u.published = 1 AND b.published = 1'; } $nullDate = $db->getNullDate(); $date =& JFactory::getDate(); $now = $date->toMySQL(); $query = 'SELECT a.title AS title,' . ' a.created AS created,' . ' a.introtext AS introtext,' . ' a.fulltext AS ftext,' . ' a.id AS id,' . ' a.created_by AS created_by' . ' FROM #__content AS a' . ' INNER JOIN #__categories AS b ON b.id=a.catid' . ' INNER JOIN #__sections AS u ON u.id = a.sectionid' . ' WHERE '.$where . $publishedWhere . ' AND a.access <= '.(int) $user->get( 'aid' ) . ' AND b.access <= '.(int) $user->get( 'aid' ) . ' AND u.access <= '.(int) $user->get( 'aid' ) . ' AND ( a.publish_up = '.$db->Quote($nullDate).' OR a.publish_up <= '.$db->Quote($now).' )' . ' AND ( a.publish_down = '.$db->Quote($nullDate).' OR a.publish_down >= '.$db->Quote($now).' )' ; $db->setQuery( $query ); $item = $db->loadObject(); if ($item === null) { return new xmlrpcresp(0, $xmlrpcerruser+2, JText::_("Access Denied")); } $content = '<title>'.$item->title.'</title>'; $content .= $item->introtext.'<more_text>'.$item->ftext.'</more_text>'; $struct = new xmlrpcval( array( 'userid' => new xmlrpcval($item->created_by), 'dateCreated' => new xmlrpcval($item->created), 'content' => new xmlrpcval($content), 'postid' => new xmlrpcval($item->id) ), $xmlrpcStruct); return new xmlrpcresp($struct); } function newPost($appkey, $blogid, $username, $password, $content, $publish) { global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); if ($user->get('gid') < 19) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH')); } // Create a user access object for the user $access = new stdClass(); $access->canEdit = $user->authorize('com_content', 'edit', 'content', 'all'); $access->canEditOwn = $user->authorize('com_content', 'edit', 'content', 'own'); $access->canPublish = $user->authorize('com_content', 'publish', 'content', 'all'); if (!($access->canEdit || $access->canEditOwn)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH')); } $db =& JFactory::getDBO(); // load plugin params info $plugin =& JPluginHelper::getPlugin('xmlrpc','blogger'); $params = new JParameter( $plugin->params ); $blogid = (int) $blogid; // load the category $cat =& JTable::getInstance('category'); $cat->load($blogid); // create a new content item $item =& JTable::getInstance('content'); $item->title = plgXMLRPCBloggerHelper::getPostTitle($content); $item->introtext = plgXMLRPCBloggerHelper::getPostIntroText($content); $item->fulltext = plgXMLRPCBloggerHelper::getPostFullText($content); $item->catid = $blogid; $item->sectionid = $cat->section; $date =& JFactory::getDate(); $item->created = $date->toMySQL(); $item->created_by = $user->get('id'); $item->publish_up = $date->toMySQL(); $item->publish_down = $db->getNullDate(); $item->state = ($publish && $access->canPublish) ? 1 : 0; if (!$item->check()) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post check failed') ); } $item->version++; if (!$item->store()) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post store failed') ); } return new xmlrpcresp(new xmlrpcval($item->id, $xmlrpcString)); } function editPost($appkey, $postid, $username, $password, $content, $publish) { global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); // Create a user access object for the user $access = new stdClass(); $access->canEdit = $user->authorize('com_content', 'edit', 'content', 'all'); $access->canEditOwn = $user->authorize('com_content', 'edit', 'content', 'own'); $access->canPublish = $user->authorize('com_content', 'publish', 'content', 'all'); if (!($access->canEdit || $access->canEditOwn)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH')); } // load the row from the db table $item =& JTable::getInstance('content'); if(!$item->load( $postid )) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, no such post') ); } if($item->isCheckedOut($user->get('id'))) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, post is already being edited') ); } //lock the item $item->checkout($user->id); $item->title = plgXMLRPCBloggerHelper::getPostTitle($content); $item->introtext = plgXMLRPCBloggerHelper::getPostIntroText($content); $item->fulltext = plgXMLRPCBloggerHelper::getPostFullText($content); if (!$item->check()) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post check failed') ); } $item->version++; if (!$item->store()) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post store failed') ); } $item->state = ($publish && $access->canPublish) ? 1 : 0; //lock the item $item->checkout(); return new xmlrpcresp(new xmlrpcval('true', $xmlrpcBoolean)); } function deletePost($appkey, $postid, $username, $password, $publish) { global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); if ($user->get('gid') < 23) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH')); } // load the row from the db table $item =& JTable::getInstance('content'); if(!$item->load( $postid )) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, no such post') ); } if($item->isCheckedOut($user->get('id'))) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, post is already being edited') ); } //lock the item $item->checkout(); $item->state = -2; $item->ordering = 0; if (!$item->store()) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post delete failed') ); } return new xmlrpcresp(new xmlrpcval('true', $xmlrpcBoolean)); } /** * Blogger API - blogger.getRecentPosts * * @param xmlrpcmessage XML-RPC message passed to the method * @return xmlrpcresp XML-RPC response */ function getRecentPosts($appkey, $blogid, $username, $password, $numposts) { global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue; if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed")); } $user =& JFactory::getUser($username); plgXMLRPCBloggerHelper::getUserAid( $user ); // load plugin params info $plugin =& JPluginHelper::getPlugin('xmlrpc','blogger'); $params = new JParameter( $plugin->params ); $db =& JFactory::getDBO(); $nullDate = $db->getNullDate(); $date =& JFactory::getDate(); $now = $date->toMySQL(); $blogid = (int) $blogid; $canReadUnpublished = $user->authorize('com_content', 'edit', 'content', 'all'); if ($canReadUnpublished) { $publishedWhere = ''; $publishTimeWhere = ''; } else { $publishedWhere = ' AND u.published = 1 AND b.published = 1'; $publishTimeWhere = ' AND ( a.publish_up = '.$db->Quote($nullDate).' OR a.publish_up <= '.$db->Quote($now).' )' . ' AND ( a.publish_down = '.$db->Quote($nullDate).' OR a.publish_down >= '.$db->Quote($now).' )'; } $query = 'SELECT a.title AS title,' . ' a.created AS created,' . ' a.introtext AS introtext,' . ' a.fulltext AS ftext,' . ' a.id AS id,' . ' a.created_by AS created_by' . ' FROM #__content AS a' . ' INNER JOIN #__categories AS b ON b.id=a.catid' . ' INNER JOIN #__sections AS u ON u.id = a.sectionid' . ' WHERE a.catid = '. $blogid . $publishedWhere . ' AND a.access <= '.(int) $user->get( 'aid' ) . ' AND b.access <= '.(int) $user->get( 'aid' ) . ' AND u.access <= '.(int) $user->get( 'aid' ) . $publishTimeWhere ; $db->setQuery($query, 0, $numposts); $items = $db->loadObjectList(); if ($items === null) { return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('No posts available, or an error has occured.') ); } $structArray = array(); foreach ($items as $item) { $content = '<title>'.$item->title.'</title>'; $content .= $item->introtext.'<more_text>'.$item->ftext.'</more_text>'; $structArray[] = new xmlrpcval(array( 'userid' => new xmlrpcval($item->created_by), 'dateCreated' => new xmlrpcval($item->created), 'content' => new xmlrpcval($content), 'postid' => new xmlrpcval($item->id) ), 'struct'); } return new xmlrpcresp(new xmlrpcval( $structArray , $xmlrpcArray)); } function getTemplate($appkey, $blogid, $username, $password, $templateType) { global $xmlrpcerruser; return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Method not implemented') ); } function setTemplate($appkey, $blogid, $username, $password, $template, $templateType) { global $xmlrpcerruser; return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Method not implemented') ); } } class plgXMLRPCBloggerHelper { function getUserAid( &$user ) { $acl = &JFactory::getACL(); //Get the user group from the ACL $grp = $acl->getAroGroup($user->get('id')); // Mark the user as logged in $user->set('guest', 0); $user->set('aid', 1); // Fudge Authors, Editors, Publishers and Super Administrators into the special access group if ($acl->is_group_child_of($grp->name, 'Registered') || $acl->is_group_child_of($grp->name, 'Public Backend')) { $user->set('aid', 2); } } function authenticateUser($username, $password) { // Get the global JAuthentication object jimport( 'joomla.user.authentication'); $auth = & JAuthentication::getInstance(); $credentials = array( 'username' => $username, 'password' => $password ); $options = array(); $response = $auth->authenticate($credentials, $options); return $response->status === JAUTHENTICATE_STATUS_SUCCESS; } function getPostTitle($content) { $title = ''; if ( preg_match('/<title>(.+?)<\/title>/is', $content, $matchtitle) ) { $title = $matchtitle[0]; $title = preg_replace('/<title>/si', '', $title); $title = preg_replace('/<\/title>/si', '', $title); } if (empty( $title )) { $title = substr( $content, 0, 20 ); } return $title; } function getPostCategory($content) { $category = 0; $match = array(); if ( preg_match('/<category>(.+?)<\/category>/is', $content, $match) ) { $category = trim($match[1], ','); $category = explode(',', $category); } return $category; } function getPostIntroText($content) { return plgXMLRPCBloggerHelper::removePostData($content); //substr($string, 0, strpos($string, '<more_text>')); } function getPostFullText($content) { $match = array(); if ( preg_match('/<more_text>(.+?)<\/more_text>/is', $content, $match) ) { $fulltext = $match[0]; $fulltext = preg_replace('/<more_text>/si', '', $fulltext); $fulltext = preg_replace('/<\/more_text>/si', '', $fulltext); } return $fulltext; } function removePostData($content) { $content = preg_replace('/<title>(.+?)<\/title>/si', '', $content); $content = preg_replace('/<category>(.+?)<\/category>/si', '', $content); $content = preg_replace('/<more_text>(.+?)<\/more_text>/si', '', $content); $content = trim($content); return $content; } }