Server IP : 180.180.241.3 / Your IP : 216.73.216.252 Web Server : Microsoft-IIS/7.5 System : Windows NT NETWORK-NHRC 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586 User : IUSR ( 0) PHP Version : 5.3.28 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /AppServ/www/news/components/com_jfusion/ |
Upload File : |
<?php function initJFusionAPI() { if (!defined('_JEXEC')) { $secretkey = 'secret passphrase'; if ($secretkey == 'secret passphrase') { exit('JFusion Api Disabled'); } $JFusionAPI = new JFusionAPI('',$secretkey); $JFusionAPI->parse(); } } // add everything inside a function to prevent 'sniffing'; if (!defined('_JFUSIONAPI_INTERNAL')) { initJFusionAPI(); } /** * JFusionAPI class * * @category JFusion * @package API * @subpackage JFusionAPI * @author JFusion Team <webmaster@jfusion.org> * @copyright 2008 JFusion. All rights reserved. * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL * @link http://www.jfusion.org */ class JFusionAPI { public $url; public $sid = null; private $secret = null; private $hash = null; private $error = array(); private $debug = array(); /** * @param string $url * @param string $secret */ public function __construct($url = '', $secret = '') { if (!function_exists('mcrypt_decrypt') || !function_exists('mcrypt_encrypt')) { $this->error[] = 'Missing: mcrypt'; } if ($url == '') { if (session_id()) { session_write_close(); } ini_set('session.use_cookies', '0'); ini_set('session.use_trans_sid', '1'); ini_set('session.use_only_cookies', '0'); session_name('PHPSESSID'); session_start(); $this->sid = session_id(); $this->hash = JFusionAPI::getSession('hash'); } $this->setTarget($url, $secret); } /** * @param string $url * @param string $secret * * @return void */ public function setTarget($url = '', $secret = '') { $this->url = $url; $this->secret = $secret; } /** * @return array */ public function getError() { return $this->error; } /** * @return array */ public function getDebug() { return $this->debug; } /** * @param $read * * @return string */ public function read($read) { $data = null; if (isset($_REQUEST[$read])) { $data = (string) preg_replace( '/[^A-Z_]/i', '', $_REQUEST[$read]); } return $data; } /** * @return bool */ private function retrieveKey() { if ($this->hash && $this->sid) return true; $hash = $this->get('status', 'key'); if (empty($this->error) && $hash) { $this->hash = $hash; return true; } return false; } /** * @return bool */ public function ping() { if ($this->hash && $this->sid) return true; $pong = $this->get('status', 'ping'); if (empty($this->error) && $pong == 'pong') { return true; } return false; } /** * @return void */ public function parse() { $type = strtolower($this->read('jftype')); $task = ucfirst(strtolower($this->read('jftask'))); $data=array(); $encrypt = false; //controller for when api gets called externally if ($type) { $class = $this->createClass($this->read('jfclass')); if ($class) { $function = $type.$task; if (method_exists( $class , $function )) { $data['payload'] = $class->$function(); $this->error = $class->error; $this->debug = $class->debug; $encrypt = $class->encrypt; } else { $this->error[] = 'Class: '.get_class($class).' Method: '.$function.' undefined'; } } else { $this->error[] = 'Type: '.$type.' Class: undefined'; } } else { $this->error[] = 'type not defined'; } $this->doOutput($data, $encrypt); } /** * @param string $class * @return null|JFusionAPIBase */ public function createClass($class) { //controller for when api gets called externally $class = ucfirst(strtolower($class)); if ($class) { $class = 'JFusionAPI_'.$class; $class = new $class($this->createkey()); } else { $class = null; } return $class; } /** * @param $class * @param $task * @param $return * * @return string */ public function getExecuteURL($class,$task,$return) { $url = $this->url.'?jftask='.$task.'&jfclass='.$class.'&jftype=execute&jfreturn='.base64_encode($return); if ($this->sid) { $url .= '&PHPSESSID='.$this->sid; } return $url; } /** * @param $class * @param $task * @param array $payload * * @return bool */ public function set($class, $task, $payload=array()) { return $this->raw('set',$class, $task, $payload); } /** * @param $class * @param $task * @param array $payload * * @return bool */ public function get($class, $task, $payload=array()) { return $this->raw('get',$class, $task, $payload); } /** * @param $class * @param $task * @param array $payload * @param string $return * * @return bool */ public function execute($class, $task, $payload=array(), $return='') { if (!empty($return)) { header('Location: '.$this->getExecuteURL($class,$task,$return).'&jfpayload='.base64_encode(serialize($payload))); return true; } else { return $this->raw('execute',$class, $task, $payload); } } /** * @param string $type * @param string $class * @param string $task * @param array $payload * @return mixed */ private function raw($type, $class, $task, $payload=array()) { $key = true; $c = $this->createClass($class); if ($c && $c->encrypt) { $key = $this->retrieveKey(); } if ($key) { $result = $this->post($class,$type,$task,$payload); $result = $this->getOutput($result); if (empty($this->error)) { return $result; } } return false; } /** * @static * @param string $class * @param bool $delete * * @return mixed */ static function getSession($class,$delete=false) { $return = null; if (isset($_SESSION['JFusionAPI'])) { if (isset($_SESSION['JFusionAPI'][$class])) { $return = $_SESSION['JFusionAPI'][$class]; if ($delete) { unset($_SESSION['JFusionAPI'][$class]); } } } return $return; } /** * @static * @param string $class * @param mixed $value */ static function setSession($class,$value) { $_SESSION['JFusionAPI'][$class] = $value; } /** * @return \stdClass */ private function createkey() { $keyinfo = new stdClass; if (!$this->hash) { $this->hash = JFusionAPI::getSession('hash'); } $keyinfo->secret = md5($this->secret); $keyinfo->hash = $this->hash; return $keyinfo; } /** * @static * @param $keyinfo * @param array $payload * * @return null|string */ public static function encrypt($keyinfo, $payload=array()) { if (isset($keyinfo->secret) && isset($keyinfo->hash) && function_exists('mcrypt_encrypt')) { $encrypted = trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $keyinfo->secret, serialize($payload), MCRYPT_MODE_NOFB, $keyinfo->hash))); } else { $encrypted = null; } return $encrypted; } /** * @static * @param $keyinfo * @param $payload * * @return bool|array */ public static function decrypt($keyinfo, $payload) { if (isset($keyinfo->secret) && isset($keyinfo->hash) && function_exists('mcrypt_decrypt')) { $decrypted = @unserialize(trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $keyinfo->secret, base64_decode($payload), MCRYPT_MODE_NOFB, $keyinfo->hash))); } else { $decrypted = false; } return $decrypted; } /** * @param string $class * @param string $type * @param string $task * @param array $payload * * @return string|bool */ private function post($class,$type,$task,$payload=array()) { $this->error = array(); $this->debug = array(); $result = false; //check to see if cURL is loaded if (!function_exists('curl_init')) { $this->error[] = 'JfusionAPI: sorry cURL is needed for JFusionAPI'; } elseif (!function_exists('mcrypt_decrypt') || !function_exists('mcrypt_encrypt')) { $this->error[] = 'Missing: mcrypt'; } else { $post=array(); if ($this->sid) { $post['PHPSESSID'] = $this->sid; } $post['jfclass'] = $class; $post['jftype'] = strtolower($type); $post['jftask'] = $task; if (!empty($payload)) { $post['jfpayload'] = JFusionAPI::encrypt($this->createkey(),$payload); } $crl = curl_init(); curl_setopt($crl, CURLOPT_URL,$this->url); curl_setopt($crl, CURLOPT_HEADER, 0); curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($crl, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($crl, CURLOPT_TIMEOUT, 10); curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($crl, CURLOPT_POST ,1); curl_setopt($crl, CURLOPT_POSTFIELDS , $post); $result = curl_exec($crl); if (curl_error($crl)) { $this->error[] = curl_error($crl); } curl_close($crl); } return $result; } /** * @param $output * @param bool $encrypt * * @return void */ private function doOutput($output,$encrypt=false) { $output['PHPSESSID'] = $this->sid; $output['error'] = $this->error; $output['debug'] = $this->debug; $result = null; if ($encrypt) { $result = JFusionAPI::encrypt($this->createkey() , $output); if ($result == null) { $output['error'] = 'Encryption failed'; } } if ($result == null) { $result = base64_encode(serialize($output)); } echo $result; exit(); } /** * @param $input * * @return bool|mixed */ private function getOutput($input) { $return = JFusionAPI::decrypt($this->createkey() , $input); if (!is_array($return)) { $return = @unserialize(trim(base64_decode($input))); } if (!is_array($return)) { $this->error[] = 'JfusionAPI: error output: '. $input; return false; } else if (isset($return['PHPSESSID'])) { $this->sid = $return['PHPSESSID']; } if (isset($return['debug'])) { $this->debug = $return['debug']; } if (isset($return['error']) && !empty($return['error'])) { return false; } else if (isset($return['payload'])) { return $return['payload']; } return true; } } /** * */ class JFusionAPIBase { public $encrypt = true; public $payload = array(); public $error = array(); public $debug = array(); public $key = null; /** * @param $key */ public function __construct($key) { $this->key = $key; $this->readPayload($this->encrypt); } /** * @param $encrypt * * @return bool */ protected function readPayload($encrypt) { if (!$encrypt && isset($_GET['jfpayload'])) { $payload = @unserialize(trim(base64_decode($_GET['jfpayload']))); } else if ($encrypt && isset($_POST['jfpayload'])) { $payload = JFusionAPI::decrypt($this->key , $_POST['jfpayload']); } if (isset($payload) && is_array($payload) ) { $this->payload = $payload; return true; } return false; } /** * @param $payload * * @return string */ protected function buildPayload($payload) { return base64_encode(serialize($payload)); } /** * @param string|null $url Url of where to redirect to * * @return void */ protected function doExit($url = null) { if ($url && isset($_GET['jfreturn'])) { $url .= '&jfreturn='.$_GET['jfreturn']; } else if (isset($_GET['jfreturn'])) { $url = base64_decode($_GET['jfreturn']); } if ( $url ) { header('Location: '.$url); } exit(); } } /** * */ class JFusionAPI_Status extends JFusionAPIBase { public $encrypt = false; /** * @return array */ public function getKey() { // $hash = sha1($hash); //to improve variance // srand((double) microtime() * 1000000); // $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_NOFB), MCRYPT_RAND); $iv = ''; $seed = hexdec(substr(md5(microtime()), -8)) & 0x7fffffff; mt_srand($seed); for($i = 0; $i < 32; $i++) { $iv .= chr(mt_rand(0,255)); } JFusionAPI::setSession('hash',$iv); return $iv; } /** * @return array */ public function getPing() { return 'pong'; } } /** * */ class JFusionAPI_User extends JFusionAPIBase { /** * @return mixed */ public function getUser() { $mainframe = JFusionAPIInternal::startJoomla(); $plugin = isset($this->payload['plugin']) ? $this->payload['plugin'] : 'joomla_int'; $userPlugin = JFusionFactory::getUser($plugin); return $userPlugin->getUser($this->payload['username']); } /** * @return bool */ public function setLogin() { if(!empty($this->payload['username']) && !empty($this->payload['password'])) { $session['login'] = $this->payload; JFusionAPI::setSession('user',$session); return true; } else { return false; } } /** * @return void */ public function executeLogin() { $session = JFusionAPI::getSession('user',true); if (isset($session['login'])) { $userinfo = $session['login']; if (is_array($userinfo)) { $joomla = new JFusionAPIInternal(); if (isset($userinfo['plugin'])) { $joomla->setActivePlugin($userinfo['plugin']); } $joomla->login($userinfo['username'],$userinfo['password']); } } $this->doExit(); } /** * @return void */ public function executeLogout() { if ($this->readPayload(false)) { $joomla = new JFusionAPIInternal(); if (isset($userinfo['plugin'])) { $joomla->setActivePlugin($userinfo['plugin']); } $username = isset($this->payload['username']) ? $this->payload['username'] : null; $joomla->logout($username); } $this->doExit(); } /** * @return void */ public function executeRegister() { if ( $this->payload ) { if ( isset($this->payload['userinfo']) && get_class($this->payload['userinfo']) == 'stdClass') { $joomla = new JFusionAPIInternal(); if (isset($userinfo['plugin'])) { $joomla->setActivePlugin($userinfo['plugin']); } if (isset($this->payload['overwrite']) && $this->payload['overwrite']) { $overwrite = 1; } else { $overwrite = 0; } $joomla->register($this->payload['userinfo'],$overwrite); $this->error = $joomla->error; $this->debug = $joomla->debug; } else { $this->error[] = 'invalid payload'; } } else { $this->error[] = 'invalid payload'; } } /** * @return void */ public function executeUpdate() { if ( $this->payload ) { if ( isset($this->payload['userinfo']) && is_array($this->payload['userinfo'])) { $joomla = new JFusionAPIInternal(); if (isset($this->payload['overwrite']) && $this->payload['overwrite']) { $overwrite = 1; } else { $overwrite = 0; } $joomla->update($this->payload['userinfo'],$overwrite); $this->error = $joomla->error; $this->debug = $joomla->debug; } else { $this->error[] = 'invalid payload'; } } else { $this->error[] = 'invalid payload'; } } /** * @return void */ public function executeDelete() { if ( $this->payload ) { if ( isset($this->payload['userid']) ) { $joomla = new JFusionAPIInternal(); $joomla->delete($this->payload['userid']); $this->error = $joomla->error; $this->debug = $joomla->debug; } else { $this->error[] = 'invalid payload'; } } else { $this->error[] = 'invalid payload'; } } } /** * */ class JFusionAPI_Cookie extends JFusionAPIBase { /** * @return bool */ public function setCookies() { if (is_array($this->payload)) { $session['cookies'] = $this->payload; JFusionAPI::setSession('cookie',$session); return true; } else { return false; } } /** * @return void */ public function executeCookies() { if ($this->readPayload(false)) { $session = JFusionAPI::getSession('cookie',true); if ( isset($session['cookies']) && count($session['cookies']) && is_array($session['cookies']) ) { foreach($session['cookies'] as $key => $value ) { header('Set-Cookie: '.$value, false); } } if ( count($this->payload['url']) ) { foreach($this->payload['url'] as $key => $value ) { unset($this->payload['url'][$key]); $this->payload = $this->buildPayload($this->payload); $this->doExit($key.'?jfpayload='.$this->payload.'&PHPSESSID='.$value.'&jftype=execute&jfclass=cookie&jftask=cookies'); } } else { $this->doExit(); } } exit; } } /** * Intended for direct integration with joomla (loading the joomla framework directly in to other software.) */ class JFusionAPIInternal extends JFusionAPIBase { var $activePlugin = null; /** * */ public function __construct() { } /** * @return JApplication */ public static function startJoomla() { $old = error_reporting(0); if (!defined('_JEXEC')) { /** * @TODO determine if we really need session_write_close or if it need to be selectable */ // trick joomla into thinking we're running through joomla define('_JEXEC', true); define('DS', DIRECTORY_SEPARATOR); define('JPATH_BASE', dirname(__FILE__). DS . '..'. DS . '..'); // load joomla libraries require_once JPATH_BASE . DS . 'includes' . DS . 'defines.php'; define('_JREQUEST_NO_CLEAN', true); // we don't want to clean variables as it can "corrupt" them for some applications, it also clear any globals used... if (!class_exists('JVersion')) { if (file_exists(JPATH_LIBRARIES.DS.'cms'.DS.'version'.DS.'version.php')) { include_once(JPATH_LIBRARIES.DS.'cms'.DS.'version'.DS.'version.php'); } elseif (file_exists(JPATH_LIBRARIES.DS.'joomla'.DS.'version.php')) { include_once(JPATH_LIBRARIES.DS.'joomla'.DS.'version.php'); } elseif (file_exists(JPATH_ROOT.DS.'includes'.DS.'version.php')) { include_once(JPATH_ROOT.DS.'includes'.DS.'version.php'); } } include_once JPATH_LIBRARIES.'/import.php'; require_once JPATH_LIBRARIES . DS . 'loader.php'; $autoloaders = spl_autoload_functions(); if ($autoloaders && in_array('__autoload', $autoloaders)) { spl_autoload_register('__autoload'); } require_once JPATH_ROOT . DS . 'includes' . DS . 'framework.php'; jimport('joomla.base.object'); jimport('joomla.factory'); jimport('joomla.filter.filterinput'); jimport('joomla.error.error'); jimport('joomla.event.dispatcher'); jimport('joomla.event.plugin'); jimport('joomla.plugin.helper'); jimport('joomla.utilities.arrayhelper'); jimport('joomla.environment.uri'); jimport('joomla.environment.request'); jimport('joomla.user.user'); jimport('joomla.html.parameter'); // JText cannot be loaded with jimport since it's not in a file called text.php but in methods JLoader::register('JText', JPATH_LIBRARIES . DS . 'joomla' . DS . 'methods.php'); JLoader::register('JRoute', JPATH_LIBRARIES . DS . 'joomla' . DS . 'methods.php'); //load JFusion's libraries require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfusion' . DS . 'models' . DS . 'model.factory.php'; require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfusion' . DS . 'models' . DS . 'model.jfusion.php'; } elseif (!defined('IN_JOOMLA')) { define('IN_JOOMLA', 1); JFusionFunction::reconnectJoomlaDb(); } $mainframe = JFactory::getApplication('site'); $GLOBALS['mainframe'] = $mainframe; error_reporting($old); return $mainframe; } /** * @param string $plugin * * @return void */ public function setActivePlugin($plugin) { $this->activePlugin = $plugin; } /** * @param string $username * @param string $password * @param int $remember * * @return void */ public function login($username,$password,$remember = 1) { $mainframe = $this->startJoomla(); if ($this->activePlugin) { global $JFusionActivePlugin; $JFusionActivePlugin = $this->activePlugin; } // do the login $credentials = array('username' => $username, 'password' => $password); $options = array('entry_url' => JURI::root() . 'index.php?option=com_user&task=login', 'silent' => true); $options['remember'] = $remember; $mainframe->login($credentials, $options); //clean up the joomla session object before continuing $session = JFactory::getSession(); $id = $session->getId(); $session_data = session_encode(); $session->close(); //if we are not frameless, then we need to manually update the session data as on some servers, this data is getting corrupted //by php session_write_close and thus the user is not logged into Joomla. php bug? if (!defined('IN_JOOMLA') && $id) { /** * @ignore * @var $session_table JTableSession */ $session_table = JTable::getInstance('session'); if ($session_table->load($id)) { $session_table->data = $session_data; $session_table->store(); } else { // if load failed then we assume that it is because // the session doesn't exist in the database // therefore we use insert instead of store $app = JFactory::getApplication(); $session_table->data = $session_data; $session_table->insert($id, $app->getClientId()); } } } /** * @param null|string $username * * @return void */ public function logout($username=null) { $mainframe = $this->startJoomla(); if ($this->activePlugin) { global $JFusionActivePlugin; $JFusionActivePlugin = $this->activePlugin; } $user = new stdClass; if ($username) { if ($this->activePlugin) { $lookupUser = JFusionFunction::lookupUser($this->activePlugin,null,false,$username); if (!empty($lookupUser)) { $user = JFactory::getUser($lookupUser->id); } } else { $user = JFactory::getUser($username); } } if (isset($user->userid) && $user->userid) { $mainframe->logout($user->userid); } else { $mainframe->logout(); } // clean up session $session = JFactory::getSession(); $session->close(); //redirect to prevent fatal errors on some servers $uri = JURI::getInstance(); //add a variable to ensure refresh $link = $uri->toString(); } /** * @param object $userinfo * * @return void */ public function register($userinfo) { $mainframe = $this->startJoomla(); $plugins = JFusionFunction::getSlaves(); $plugins[] = JFusionFunction::getMaster(); if ( $this->activePlugin ) { foreach ($plugins as $key => $plugin) { if ($plugin->name == $this->activePlugin) { unset($plugins[$key]); } } } foreach ($plugins as $plugin) { $PluginUserUpdate = JFusionFactory::getUser($plugin->name); $existinguser = $PluginUserUpdate->getUser($userinfo); if(!$existinguser) { $status = array('error' => array(),'debug' => array()); $PluginUserUpdate->createUser($userinfo,$status); foreach ($status['error'] as $error) { $this->error[][$plugin->name] = $error; } foreach ($status['debug'] as $debug) { $this->debug[][$plugin->name] = $debug; } } else { $this->error[][$plugin->name] = 'user already exsists'; } } } /** * @param array $userinfo * @param $overwrite * * @return void */ public function update($userinfo,$overwrite) { $mainframe = $this->startJoomla(); $plugins = JFusionFunction::getSlaves(); $plugins[] = JFusionFunction::getMaster(); foreach ($plugins as $key => $plugin) { if (!array_key_exists($plugin->name,$userinfo)) { unset($plugins[$key]); } } foreach ($plugins as $plugin) { $PluginUserUpdate = JFusionFactory::getUser($plugin->name); $updateinfo = $userinfo[$plugin->name]; if (get_class($updateinfo) == 'stdClass') { $lookupUser = JFusionFunction::lookupUser($plugin->name,'',false,$updateinfo->username); if($lookupUser) { $existinguser = $PluginUserUpdate->getUser($updateinfo->username); foreach ($updateinfo as $key => $value) { if ($key != 'userid' && isset($existinguser->$key)) { if ( $existinguser->$key != $updateinfo->$key ) { $existinguser->$key = $updateinfo->$key; } } } $this->debug[][$plugin->name] = $PluginUserUpdate->updateUser($existinguser, $overwrite); } else { $this->error[][$plugin->name] = 'invalid user'; } } else { $this->error[][$plugin->name] = 'invalid update user'; } } } /** * @param int $userid * * @return void */ public function delete($userid) { $mainframe = $this->startJoomla(); /** * @ignore * @var $user JUser */ $user = JUser::getInstance($userid); if ($user) { if ($user->delete()) { $this->debug[] = 'user deleted: '.$userid; } else { $this->error[] = 'Delete user failed: '.$userid; } } else { $this->error[] = 'invalid user'; } } }