| Server IP : 180.180.241.3 / Your IP : 216.73.216.216 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 : C:/AppServ/www/news/administrator/components/com_jfusion/models/ |
Upload File : |
<?php
/**
* Model for all jfusion related function
*
* PHP version 5
*
* @category JFusion
* @package Models
* @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
*/
// no direct access
defined('_JEXEC') or die('Restricted access');
/**
* Class for general JFusion functions
*
* @category JFusion
* @package Models
* @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 JFusionFunction
{
/**
* Returns the JFusion plugin name of the software that is currently the master of user management
*
* @return object master details
*/
public static function getMaster()
{
static $jfusion_master;
if (!isset($jfusion_master)) {
$db = JFactory::getDBO();
$query = 'SELECT * from #__jfusion WHERE master = 1 and status = 1';
$db->setQuery($query);
$jfusion_master = $db->loadObject();
}
return $jfusion_master;
}
/**
* Returns the JFusion plugin name of the software that are currently the slaves of user management
*
* @return object slave details
*/
public static function getSlaves()
{
static $jfusion_slaves;
if (!isset($jfusion_slaves)) {
$db = JFactory::getDBO();
$query = 'SELECT * from #__jfusion WHERE slave = 1 and status = 1';
$db->setQuery($query);
$jfusion_slaves = $db->loadObjectList();
}
return $jfusion_slaves;
}
/**
* Changes plugin status in both Joomla 1.5 and Joomla 1.6
*
* @param string $element
* @param string $folder
*
* @return object master details
*/
public static function getPluginStatus($element,$folder) {
//get joomla specs
$db = JFactory::getDBO();
if(JFusionFunction::isJoomlaVersion('1.6')){
$query = 'SELECT published FROM #__extensions WHERE element=' . $db->Quote($element) . ' AND folder=' . $db->Quote($folder);
} else {
$query = 'SELECT published FROM #__plugins WHERE element=' . $db->Quote($element) . ' AND folder=' . $db->Quote($folder);
}
$db->setQuery($query);
$result = $db->loadResult();
return $result;
}
/**
* Creates a JFusion Joomla compatible URL
*
* @param string $url string url to be parsed
* @param string $itemid string itemid of the JFusion menu item or the name of the plugin for direct link
* @param string $jname optional jname if available to prevent having to find it based on itemid
* @param boolean $route boolean optional switch to send url through JRoute::_() (true by default)
* @param boolean $xhtml boolean optional switch to turn & into & if $route is true (true by default)
*
* @return string Parsed URL
*/
public static function routeURL($url, $itemid, $jname = '', $route = true, $xhtml = true)
{
if (!is_numeric($itemid)) {
if ($itemid == 'joomla_int') {
//special handling for internal URLs
if ($route) {
$url = JRoute::_($url, $xhtml);
}
} else {
//we need to create direct link to the plugin
$params = JFusionFactory::getParams($itemid);
$url = $params->get('source_url') . $url;
if ($xhtml) {
$url = str_replace('&', '&', $url);
}
}
} else {
//we need to create link to a joomla itemid
if (empty($jname)) {
//determine the jname from the plugin
static $routeURL_jname;
if (!is_array($routeURL_jname)) {
$routeURL_jname = array();
}
if (!isset($routeURL_jname[$itemid])) {
$menu = JSite::getMenu();
/**
* @ignore
* @var $menu_param JParameter
*/
$menu_param = $menu->getParams($itemid);
$plugin_param = unserialize(base64_decode($menu_param->get('JFusionPluginParam')));
$routeURL_jname[$itemid] = $plugin_param['jfusionplugin'];
$jname = $routeURL_jname[$itemid];
} else {
$jname = $routeURL_jname[$itemid];
}
}
//make the URL relative so that external software can use this function
$params = JFusionFactory::getParams($jname);
$source_url = $params->get('source_url');
$url = str_replace($source_url, '', $url);
$config = JFactory::getConfig();
$sefenabled = $config->getValue('config.sef');
$params = JFusionFactory::getParams($jname);
$sefmode = $params->get('sefmode', 1);
if ($sefenabled && !$sefmode) {
//otherwise just tak on the URL
$baseURL = JFusionFunction::getPluginURL($itemid, false);
$url = $baseURL . $url;
if ($xhtml) {
$url = str_replace('&', '&', $url);
}
} else {
//fully parse the URL if sefmode = 1
$u = JURI::getInstance($url);
$u->setVar('jfile', $u->getPath());
$u->setVar('option', 'com_jfusion');
$u->setVar('Itemid', $itemid);
$query = $u->getQuery(false);
$fragment = $u->getFragment();
if (isset($fragment)) {
$query.= '#' . $fragment;
}
if ($route) {
$url = JRoute::_('index.php?' . $query, $xhtml);
} else {
$url = 'index.php?' . $query;
}
}
}
return $url;
}
/**
* Returns either the Joomla wrapper URL or the full URL directly to the forum
*
* @param string $url relative path to a webpage of the integrated software
* @param string $jname name of the JFusion plugin used
* @param string $view name of the JFusion view used
* @param string $itemid the itemid
*
* @return string full URL to the filename passed to this function
*/
public static function createURL($url, $jname, $view, $itemid = '')
{
if (!empty($itemid)) {
//use the itemid only to identify plugin name and view type
$base_url = 'index.php?option=com_jfusion&Itemid=' . $itemid;
} else {
$base_url = 'index.php?option=com_jfusion&Itemid=-1&view=' . $view . '&jname=' . $jname;
}
if ($view == 'direct') {
$params = JFusionFactory::getParams($jname);
$url = $params->get('source_url') . $url;
} elseif ($view == 'wrapper') {
//use base64_encode to encode the URL for passing. But, base64_code uses / which throws off SEF urls. Thus slashes
//must be translated into something base64_encode will not generate and something that will not get changed by Joomla or Apache.
$url = $base_url . '&wrap=' . str_replace('/', '_slash_', base64_encode($url));
$url = JRoute::_($url);
} elseif ($view == 'frameless') {
//split the filename from the query
$parts = explode('?', $url);
if (isset($parts[1])) {
$base_url.= '&jfile=' . $parts[0] . '&' . $parts[1];
} else {
$base_url.= '&jfile=' . $parts[0];
}
$url = JRoute::_($base_url);
}
return $url;
}
/**
* Updates the JFusion user lookup table during login
*
* @param object $userinfo object containing the userdata
* @param string $joomla_id The Joomla ID of the user
* @param string $jname name of the JFusion plugin used
* @param boolean $delete deletes an entry from the table
*
* @return string nothing
*/
public static function updateLookup($userinfo, $joomla_id, $jname = '', $delete = false)
{
if ($userinfo) {
$db = JFactory::getDBO();
//we don't need to update the lookup for internal joomla unless deleting a user
if ($jname == 'joomla_int') {
if ($delete) {
//Delete old user data in the lookup table
$query = 'DELETE FROM #__jfusion_users WHERE id =' . $joomla_id . ' OR username = ' . $db->Quote($userinfo->username) . ' OR LOWER(username) = ' . strtolower($db->Quote($userinfo->email));
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
//Delete old user data in the lookup table
$query = 'DELETE FROM #__jfusion_users_plugin WHERE id =' . $joomla_id . ' OR username = ' . $db->Quote($userinfo->username) . ' OR LOWER(username) = ' . strtolower($db->Quote($userinfo->email));
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
}
} else {
//check to see if we have been given a joomla id
if (empty($joomla_id)) {
$query = 'SELECT id FROM #__users WHERE username = ' . $db->Quote($userinfo->username);
$db->setQuery($query);
$joomla_id = $db->loadResult();
if (empty($joomla_id)) {
return;
}
}
if (empty($jname)) {
$queries = array();
//we need to update each master/slave
$query = 'SELECT name FROM #__jfusion WHERE master = 1 OR slave = 1';
$db->setQuery($query);
$jnames = $db->loadObjectList();
foreach ($jnames as $jname) {
if ($jname->name != 'joomla_int') {
$user = JFusionFactory::getUser($jname->name);
$puserinfo = $user->getUser($userinfo);
if ($delete) {
$queries[] = '(id = '.$joomla_id.' AND jname = ' . $db->Quote($jname->name) . ')';
} else {
$queries[] = '(' . $db->Quote($puserinfo->userid) . ',' . $db->Quote($puserinfo->username) . ', '.$joomla_id.', '. $db->Quote($jname->name) . ')';
}
unset($user);
unset($puserinfo);
}
}
if (!empty($queries)) {
if ($delete) {
$query = 'DELETE FROM #__jfusion_users_plugin WHERE ' . implode(' OR ', $queries);
} else {
$query = 'REPLACE INTO #__jfusion_users_plugin (userid,username,id,jname) VALUES (' . implode(',', $queries) . ')';
}
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
}
} else {
if ($delete) {
$query = 'DELETE FROM #__jfusion_users_plugin WHERE id = '.$joomla_id.' AND jname = '.$db->Quote($jname);
} else {
$query = 'REPLACE INTO #__jfusion_users_plugin (userid,username,id,jname) VALUES ('.$db->Quote($userinfo->userid) .' ,'.$db->Quote($userinfo->username) .' ,'.$joomla_id.' , '.$db->Quote($jname).' )';
}
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
}
}
}
}
/**
* Returns the userinfo data for JFusion plugin based on the userid
*
* @param string $jname name of the JFusion plugin used
* @param string $userid The ID of the user
* @param boolean $isJoomlaId if true, returns the userinfo data based on Joomla, otherwise the plugin
* @param string $username If the userid is that of the plugin, we need the username to find the user in case there is no record in the lookup table
*
* @return object database Returns the userinfo as a Joomla database object
*
*/
public static function lookupUser($jname, $userid, $isJoomlaId = true, $username = '')
{
//initialise some vars
$db = JFactory::getDBO();
$result = '';
if (!empty($userid)) {
$column = ($isJoomlaId) ? 'a.id' : 'a.userid';
$query = 'SELECT a.*, b.email FROM #__jfusion_users_plugin AS a INNER JOIN #__users AS b ON a.id = b.id WHERE ' . $column . ' = ' . $db->Quote($userid) . ' AND a.jname = ' . $db->Quote($jname);
$db->setQuery($query);
$result = $db->loadObject();
}
//for some reason this user is not in the lookup table so let's find them
if (empty($result)) {
if ($isJoomlaId) {
//we have a joomla id so let's setup a temp $userinfo
$query = 'SELECT username, email FROM #__users WHERE id = '.$userid;
$db->setQuery($query);
$result = $db->loadResult();
$joomla_id = $userid;
} else {
//we have a plugin id so we need to find Joomla id then setup a temp $userinfo
//first try JFusion's user table
$query = 'SELECT a.id, a.email FROM #__users AS a INNER JOIN #__jfusion_users as b ON a.id = b.id WHERE b.username = ' . $db->Quote($username);
$db->setQuery($query);
$result = $db->loadObject();
//not created by JFusion so let's check the Joomla table directly
if (empty($result)) {
$query = 'SELECT id, email FROM #__users WHERE username = ' . $db->Quote($username);
$db->setQuery($query);
$result = $db->loadObject();
}
if (!empty($result)) {
//we have a user
$result->username = $username;
$joomla_id = $result->id;
}
}
if (!empty($result) && !empty($joomla_id) && !empty($jname)) {
//get the plugin userinfo - specifically we need the userid which it will provide
$user = JFusionFactory::getUser($jname);
$existinguser = $user->getUser($result);
if (!empty($existinguser)) {
//update the lookup table with the new acquired info
JFusionFunction::updateLookup($existinguser, $joomla_id, $jname);
//return the results
$result = new stdClass();
$result->userid = $existinguser->userid;
$result->username = $existinguser->username;
$result->id = $joomla_id;
$result->jname = $jname;
} else {
//the user does not exist in the software which means they were probably a guest or deleted from the integrated software
//we can't create the user as we have no password
$result = new stdClass();
$result->userid = '0';
$result->username = $username;
$result->id = $joomla_id;
$result->jname = $jname;
}
}
}
return $result;
}
/**
* Checks to see if a JFusion plugin is properly configured
*
* @param string $jname name of the JFusion plugin used
*
* @return boolean returns true if plugin is correctly configured
*/
public static function validPlugin($jname)
{
$db = JFactory::getDBO();
$query = 'SELECT status FROM #__jfusion WHERE name =' . $db->Quote($jname);
$db->setQuery($query);
$result = $db->loadResult();
if ($result == '1') {
$result = true;
} else {
$result = false;
}
return $result;
}
/**
* Delete old user data in the lookup table
*
* @param object $userinfo userinfo of the user to be deleted
*
* @return string nothing
*/
public static function removeUser($userinfo)
{
//Delete old user data in the lookup table
$db = JFactory::getDBO();
$query = 'DELETE FROM #__jfusion_users WHERE id =' . $userinfo->id . ' OR username =' . $db->Quote($userinfo->username) . ' OR LOWER(username) = ' . strtolower($db->Quote($userinfo->email));
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
$query = 'DELETE FROM #__jfusion_users_plugin WHERE id =' . $userinfo->id;
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
}
/**
* Adds a cookie to the php header
*
* @param string $name cookie name
* @param string $value cookie value
* @param int $expires cookie expiry time
* @param string $path cookie path
* @param string $domain cookie domain
* @param bool $secure is the secure
* @param bool $httponly is the cookie http only
* @param bool $mask should debug info be masked ?
*
* @return array cookie debug info
*/
public static function addCookie($name, $value, $expires, $path, $domain, $secure=false, $httponly=false, $mask = false)
{
$cookies = JFusionFactory::getCookies();
return $cookies->addCookie($name, $value, $expires, $path, $domain, $secure, $httponly, $mask);
}
/**
* Raise warning function that can handle arrays
*
* @param string $type type of warning
* @param array $warning warning itself
* @param int $redundant not used
*
* @return string nothing
*/
public static function raiseWarning($type, $warning, $redundant = 0)
{
if (is_array($warning)) {
foreach ($warning as $warningtype => $warningtext) {
//if still an array implode for nicer display
if (is_array($warningtext)) {
$warningtext = implode('</li><li>' . $warningtype . ': ', $warningtext);
}
JError::RaiseNotice('500', $warningtype . ': ' . $warningtext);
}
} else {
JError::RaiseNotice('500', $type . ': ' . $warning);
}
}
/**
* Raise warning function that can handle arrays
*
* @return array array with the php info values
*/
public static function phpinfoArray()
{
//get the phpinfo and parse it into an array
ob_start();
phpinfo();
$phpinfo = array('phpinfo' => array());
if (preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
if (strlen($match[1])) {
$phpinfo[$match[1]] = array();
} else if (isset($match[3])) {
$phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];
} else {
$phpinfo[end(array_keys($phpinfo))][] = $match[2];
}
}
}
return $phpinfo;
}
/**
* Updates the discussion bot lookup table
* @param int $contentid
* @param mixed &$threadinfo object with postid, threadid, and forumid
* @param string $jname
* @param int $published
* @param int $manual
*
* @return void
*/
public static function updateDiscussionBotLookup($contentid, &$threadinfo, $jname, $published = 1, $manual = 0)
{
$fdb = JFactory::getDBO();
$modified = JFactory::getDate()->toUnix();
$option = JRequest::getCmd('option');
//populate threadinfo with other fields if necessary for content generation purposes
//mainly used if the thread was just created
if (empty($threadinfo->component)) {
$threadinfo->contentid = $contentid;
$threadinfo->component = $option;
$threadinfo->modified = $modified;
$threadinfo->jname = $jname;
$threadinfo->published = $published;
$threadinfo->manual = $manual;
}
$query = 'REPLACE INTO #__jfusion_discussion_bot SET
contentid = '.$contentid.',
component = '.$fdb->Quote($option).',
forumid = '.$threadinfo->forumid.',
threadid = '.$threadinfo->threadid.',
postid = '.$threadinfo->postid.',
modified = '.$fdb->Quote($modified).',
jname = '.$fdb->Quote($jname).',
published = '.$published.',
manual = '.$manual;
$fdb->setQuery($query);
$fdb->query();
}
/**
* Creates the URL of a Joomla article
*
* @param string &$contentitem contentitem
* @param string $text string to place as the link
* @param string $jname jname
*
* @return string link
*/
public static function createJoomlaArticleURL(&$contentitem, $text, $jname='')
{
$mainframe = JFactory::getApplication();
$option = JRequest::getVar('option');
if ($option == 'com_k2') {
include_once JPATH_SITE . DS . 'components' . DS . 'com_k2' . DS . 'helpers' . DS . 'route.php';
$article_url = urldecode(K2HelperRoute::getItemRoute($contentitem->id.':'.urlencode($contentitem->alias),$contentitem->catid.':'.urlencode($contentitem->category->alias)));
} else {
if (empty($contentitem->slug) || empty($contentitem->catslug)) {
//article was edited and saved from editor
$db = JFactory::getDBO();
$query = 'SELECT CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END as slug,'.
' CASE WHEN CHAR_LENGTH(cc.alias) THEN CONCAT_WS(":", cc.id, cc.alias) ELSE cc.id END as catslug'.
' FROM #__content AS a' .
' LEFT JOIN #__categories AS cc ON a.catid = cc.id' .
' WHERE a.id = ' . $contentitem->id;
$db->setQuery($query);
$result = $db->loadObject();
if (!empty($result)) {
$contentitem->slug = $result->slug;
$contentitem->catslug = $result->catslug;
}
}
include_once JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php';
if (JFusionFunction::isJoomlaVersion('1.6')) {
$article_url = ContentHelperRoute::getArticleRoute($contentitem->slug, $contentitem->catslug);
} else {
$article_url = ContentHelperRoute::getArticleRoute($contentitem->slug, $contentitem->catslug, $contentitem->sectionid);
}
}
if ($mainframe->isAdmin()) {
//setup JRoute to use the frontend router
$app = JApplication::getInstance('site');
$router = $app->getRouter();
/**
* @ignore
* @var $uri JURI
*/
$uri = $router->build($article_url);
$article_url = $uri->toString();
//remove /administrator from path
$article_url = str_replace('/administrator', '', $article_url);
} else {
$article_url = JRoute::_($article_url);
}
//make the URL absolute and clean it up a bit
$joomla_url = JFusionFunction::getJoomlaURL();
$juri = new JURI($joomla_url);
$path = $juri->getPath();
if ($path != '/') {
$article_url = str_replace($path, '', $article_url);
}
if (substr($joomla_url, -1) == '/') {
if ($article_url[0] == '/') {
$article_url = substr($joomla_url, 0, -1) . $article_url;
} else {
$article_url = $joomla_url . $article_url;
}
} else {
if ($article_url[0] == '/') {
$article_url = $joomla_url . $article_url;
} else {
$article_url = $joomla_url . '/' . $article_url;
}
}
$link = '<a href="'.$article_url.'">'.$text.'</a>';
return $link;
}
/**
* Parses text from bbcode to html, html to bbcode, or html to plaintext
* $options include:
* strip_all_html - if $to==bbcode, strips all unsupported html from text (default is false)
* bbcode_patterns - if $to==bbcode, adds additional html to bbcode rules; array [0] startsearch, [1] startreplace, [2] endsearch, [3] endreplace
* parse_smileys - if $to==html, disables the bbcode smiley parsing; useful for plugins that do their own smiley parsing (default is true)
* custom_smileys - if $to==html, adds custom smileys to parser; array in the format of array[$smiley] => $path. For example $options['custom_smileys'][':-)'] = 'http://mydomain.com/smileys/smile.png';
* html_patterns - if $to==html, adds additional bbcode to html rules;
* Must be an array of elements with the custom bbcode as the key and the value in the format described at http://nbbc.sourceforge.net/readme.php?page=usage_add
* For example $options['html_patterns']['mono'] = array('simple_start' => '<tt>', 'simple_end' => '</tt>', 'class' => 'inline', 'allow_in' => array('listitem', 'block', 'columns', 'inline', 'link'));
* character_limit - if $to==html OR $to==plaintext, limits the number of visible characters to the user
* plaintext_line_breaks - if $to=='plaintext', should line breaks when converting to plaintext be replaced with <br /> (br) (default), converted to spaces (space), or left as \n (n)
* plain_tags - if $to=='plaintext', array of custom bbcode tags (without brackets) that should be stripped
*
* @param string $text the actual text
* @param string $to what to convert the text to; bbcode, html, or plaintext
* @param mixed $options array with parser options
*
* @return string with converted text
*/
public static function parseCode($text, $to, $options = array())
{
$options = !is_array($options) ? array() : $options;
if ($to == 'plaintext') {
if (!isset($options['plaintext_line_breaks'])) {
$options['plaintext_line_breaks'] = 'br';
}
/**
* @ignore
* @var $bbcode BBCode_Parser
*/
$bbcode = JFusionFactory::getCodeParser();
$bbcode->SetPlainMode(true);
if (isset($options['plain_tags']) && is_array($options['plain_tags'])) {
foreach ($options['plain_tags'] as $tag) {
$bbcode->AddRule($tag, array('class' => 'inline', 'allow_in' => array('block', 'inline', 'link', 'list', 'listitem', 'columns', 'image')));
}
}
if (!empty($options['character_limit'])) {
$bbcode->SetLimit($options['character_limit']);
}
//first thing is to protect our code blocks
$text = preg_replace("#\[code\](.*?)\[\/code\]#si", "[code]<!-- CODE BLOCK -->$1<!-- END CODE BLOCK -->[/code]", $text, '-1', $code_count);
$text = $bbcode->Parse($text);
$text = $bbcode->UnHTMLEncode(strip_tags($text));
//re-encode our code blocks
if (!empty($code_count)) {
$text = preg_replace_callback("#<!-- CODE BLOCK -->(.*?)<!-- END CODE BLOCK -->#si",array( 'JFusionFunction','_callback_htmlspecialchars'), $text);
}
//catch newly unencoded tags
$text = strip_tags($text);
if ($options['plaintext_line_breaks'] == 'br') {
$text = $bbcode->nl2br($text);
} elseif ($options['plaintext_line_breaks'] == 'space') {
$text = str_replace("\n", " ", $text);
}
} elseif ($to == 'html') {
//Encode html entities added by the plugin prepareText function
$text = htmlentities($text);
$bbcode = JFusionFactory::getCodeParser();
//do not parse & into &
$bbcode->SetAllowAmpersand(true);
if (isset($options['html_patterns']) && is_array($options['html_patterns'])) {
foreach ($options['html_patterns'] as $name => $rule) {
$bbcode->AddRule($name, $rule);
}
}
if (!empty($options['parse_smileys'])) {
$bbcode->SetSmileyURL(JFusionFunction::getJoomlaURL() . 'components/com_jfusion/images/smileys');
} else {
$bbcode->SetEnableSmileys(false);
}
if (!empty($options['custom_smileys'])) {
foreach ($options['custom_smileys'] AS $smiley => $path) {
$bbcode->AddSmiley($smiley, $path);
}
}
if (!empty($options['character_limit'])) {
$bbcode->SetLimit($options['character_limit']);
}
//disabled this as it caused issues with images and youtube links
//$bbcode->SetDetectURLs(true);
//$bbcode->SetURLPattern('<a href="{$url/h}" target="_blank">{$text/h}</a>');
//first thing is to protect our code blocks
$text = preg_replace("#\[code\](.*?)\[\/code\]#si", "[code]<!-- CODE BLOCK -->$1<!-- END CODE BLOCK -->[/code]", $text, '-1', $code_count);
$text = $bbcode->Parse($text);
//Decode for output
$text = html_entity_decode($text);
//re-encode our code blocks
if (!empty($code_count)) {
$text = preg_replace_callback("#<!-- CODE BLOCK -->(.*?)<!-- END CODE BLOCK -->#si",array( 'JFusionFunction','_callback_htmlspecialchars'), $text);
}
} elseif ($to == 'bbcode') {
if (!isset($options['bbcode_patterns'])) {
$options['bbcode_patterns'] = '';
}
if (!isset($options['strip_all_html'])) {
$options['strip_all_html'] = true;
}
//remove all line breaks to prevent massive empty space in bbcode
$text = preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text);
static $search, $replace;
if (!is_array($search)) {
$search = $replace = array();
$search[] = "#<(blockquote|cite)[^>]*>(.*?)<\/\\1>#si";
$replace[] = "[quote]$2[/quote]";
$search[] = "#<ol[^>]*>(.*?)<\/ol>#si";
$replace[] = "[list=1]$1[/list]";
$search[] = "#<ul[^>]*>(.*?)<\/ul>#si";
$replace[] = "[list]$1[/list]";
$search[] = "#<li[^>]*>(.*?)<\/li>#si";
$replace[] = "[*]$1";
$search[] = "#<img [^>]*src=['|\"](?!\w{0,10}://)(.*?)['|\"][^>]*>#si";
$replace[] = array( 'JFusionFunction','_callback_parseTag_img');
$search[] = "#<img [^>]*src=['|\"](.*?)['|\"][^>]*>#sim";
$replace[] = "[img]$1[/img]";
$search[] = "#<a [^>]*href=['|\"]mailto:(.*?)['|\"][^>]*>(.*?)<\/a>#si";
$replace[] = "[email=$1]$2[/email]";
$search[] = "#<a [^>]*href=['|\"](?!\w{0,10}://|\#)(.*?)['|\"][^>]*>(.*?)</a>#si";
$replace[] = array( 'JFusionFunction','_callback_url');
$search[] = "#<a [^>]*href=['|\"](.*?)['|\"][^>]*>(.*?)<\/a>#si";
$replace[] = "[url=$1]$2[/url]";
$search[] = "#<(b|i|u)>(.*?)<\/\\1>#si";
$replace[] = "[$1]$2[/$1]";
$search[] = "#<font [^>]*color=['|\"](.*?)['|\"][^>]*>(.*?)<\/font>#si";
$replace[] = "[color=$1]$2[/color]";
$search[] = "#<p>(.*?)<\/p>#si";
$replace[] = array( 'JFusionFunction','_callback_parseTag_p');
}
$searchNS = $replaceNS = array();
//convert anything between code or pre tags to html entities to prevent conversion
$searchNS[] = "#<(code|pre)[^>]*>(.*?)<\/\\1>#si";
$replaceNS[] = array( 'JFusionFunction','_callback_code');
$morePatterns = $options['bbcode_patterns'];
if (is_array($morePatterns) && isset($morePatterns[0]) && isset($morePatterns[1])) {
$searchNS = array_merge($searchNS, $morePatterns[0]);
$replaceNS = array_merge($replaceNS, $morePatterns[1]);
}
$searchNS = array_merge($searchNS, $search);
$replaceNS = array_merge($replaceNS, $replace);
if (is_array($morePatterns) && isset($morePatterns[2]) && isset($morePatterns[3])) {
$searchNS = array_merge($searchNS, $morePatterns[2]);
$replaceNS = array_merge($replaceNS, $morePatterns[3]);
}
$text = str_ireplace(array('<br />', '<br>', '<br/>'), "\n", $text);
foreach ($searchNS as $k => $v) {
//check if we need to use callback
if(is_array($replaceNS[$k])){
$text = preg_replace_callback($searchNS[$k],$replaceNS[$k], $text);
} else {
$text = preg_replace($searchNS[$k], $replaceNS[$k], $text);
}
}
//decode html entities that we converted for code and pre tags
$text = preg_replace_callback("#\[code\](.*?)\[\/code\]#si",array( 'JFusionFunction','_callback_code_decode'), $text);
//to prevent a billion line breaks in post, let's convert three line breaks into two
$text = preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text);
//Change to ensure that the discussion bot posts the article to the forums when there
//is an issue with preg_replace( '/\p{Z}/u', ' ', $text ) returning an empty string
//or a series of whitespace.
//Change to code David Coutts 03/08/2009
$text_utf8space_to_space = preg_replace('/\p{Z}/u', ' ', $text);
//Check to see if the returned function is not empty or purely spaces/
if (strlen(rtrim($text_utf8space_to_space)) > 0) {
//function returned properly set the output text to be the right trimmed output of the string
$text = rtrim($text_utf8space_to_space);
}
if ($options['strip_all_html']) {
$text = strip_tags($text);
}
}
return $text;
}
/**
* Used by the JFusionFunction::parseCode function to parse various tags when parsing to bbcode.
* For example, some Joomla editors like to use an empty paragraph tag for line breaks which gets
* parsed into a lot of unnecessary line breaks
*
* @param mixed $matches mixed values from preg functions
* @param string $tag
*
* @return string to replace search subject with
*/
public static function parseTag($matches, $tag = 'p')
{
$return = false;
if ($tag == 'p') {
$text = trim($matches);
//remove the slash added to double quotes and slashes added by the e modifier
$text = str_replace('\"', '"', $text);
if(empty($text) || ord($text) == 194) {
//p tags used simply as a line break
$return = "\n";
} else {
$return = $text . "\n\n";
}
} elseif ($tag == 'img') {
$joomla_url = JFusionFunction::getJoomlaURL();
$juri = new JURI($joomla_url);
$path = $juri->getPath();
if ($path != '/'){
$matches = str_replace($path,'',$matches);
}
$url = JRoute::_($joomla_url . $matches);
$return = $url;
}
return $return;
}
/**
* Reconnects Joomla DB if it gets disconnected
*
* @param bool $forceReload
*
* @return string nothing
*/
public static function reconnectJoomlaDb($forceReload=false)
{
//check to see if the Joomla database is still connected
$db = JFactory::getDBO();
jimport('joomla.database.database');
jimport('joomla.database.table');
$conf = JFactory::getConfig();
$database = $conf->getValue('config.db');
$connected = true;
if (!method_exists($db,'connected')){
$connected = false;
} elseif (!$db->connected()){
$connected = false;
}
if (!$connected||$forceReload) {
$driver = $conf->getValue('config.dbtype');
//reset current database connection
if (JFusionFunction::isJoomlaVersion('1.7')) {
JFactory::$database = null;
} else {
$db = null;
}
//create new connection
if ($driver == 'mysql') {
jimport('joomla.database.database');
jimport( 'joomla.database.table' );
$host = $conf->getValue('config.host');
$user = $conf->getValue('config.user');
$password = $conf->getValue('config.password');
$database = $conf->getValue('config.db');
$prefix = $conf->getValue('config.dbprefix','');
$debug = $conf->getValue('config.debug');
$options = array ( 'driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix );
require_once dirname(__FILE__) . DS . 'mysql.reconnect.php';
$newDBO = new JFusionReconnectMySQL($options);
if ( JFusionFunction::isJoomlaVersion('1.7') ) {
JFactory::$database = $newDBO;
}
$db = $newDBO;
if ($db->getErrorNum() > 0) {
die('Jfusion: Could not reconnect to database <br />' . $db->getErrorNum().' - '.$db->getErrorMsg());
}
$db->debug( $debug );
} else {
//connection still current no need to reload
$db = JFactory::getDBO();
}
}
//try to select the joomla database
if (!$db->select($database)) {
//oops database select failed
if (!$forceReload) {
//try to create a new database object first
JFusionFunction::reconnectJoomlaDb(true);
} else {
//even new database connection fails to resolve error
//only option now is to die
die('JFusion error: could not select Joomla database when trying to restore Joomla database object');
}
} else {
//database reconnect successful, some final tidy ups
//add utf8 support
$db->setQuery('SET names \'utf8\'');
$db->query();
//legacy $database must be restored
if (JPluginHelper::getPlugin('system', 'legacy')) {
$GLOBALS['database'] = $db;
}
}
}
/**
* Retrieves the URL to a userprofile of a Joomla supported component
*
* @param string $software string name of the software
* @param int $uid int userid of the user
* @param boolean $isPluginUid indicator of plugin in uid
* @param string $jname jname of the plugin
* @param string $username username
*
* @return string URL
*/
public static function getAltProfileURL($software, $uid, $isPluginUid = false, $jname = '', $username = '')
{
$db = JFactory::getDBO();
if ($isPluginUid && !empty($jname)) {
$userlookup = JFusionFunction::lookupUser($jname, $uid, false, $username);
if (!empty($userlookup)) {
$uid = $userlookup->id;
} else {
return '';
}
}
if (!empty($uid)) {
if ($software == 'cb') {
$query = 'SELECT id FROM #__menu WHERE type = \'component\' AND link LIKE \'%com_comprofiler%\' LIMIT 1';
$db->setQuery($query);
$itemid = $db->loadResult();
$url = JRoute::_('index.php?option=com_comprofiler&task=userProfile&Itemid=' . $itemid . '&user=' . $uid);
} elseif ($software == 'jomsocial') {
$query = 'SELECT id FROM #__menu WHERE type = \'component\' AND link LIKE \'%com_community%\' LIMIT 1';
$db->setQuery($query);
$itemid = $db->loadResult();
$url = JRoute::_('index.php?option=com_community&view=profile&Itemid=' . $itemid . '&userid=' . $uid);
} elseif ($software == 'joomunity') {
$query = 'SELECT id FROM #__menu WHERE type = \'component\' AND link LIKE \'%com_joomunity%\' LIMIT 1';
$db->setQuery($query);
$itemid = $db->loadResult();
$url = JRoute::_('index.php?option=com_joomunity&Itemid=' . $itemid . '&cmd=Profile.View.' . $uid);
} else {
$url = false;
}
} else {
$url = false;
}
return $url;
}
/**
* Retrieves the source of the avatar for a Joomla supported component
*
* @param string $software software name
* @param int $uid uid
* @param boolean $isPluginUid boolean if true, look up the Joomla id in the look up table
* @param string $jname needed if $isPluginId = true
* @param string $username username
*
* @return string nothing
*/
public static function getAltAvatar($software, $uid, $isPluginUid = false, $jname = '', $username = '')
{
$db = JFactory::getDBO();
if ($isPluginUid && !empty($jname)) {
$userlookup = JFusionFunction::lookupUser($jname, $uid, false, $username);
if (!empty($userlookup)) {
$uid = $userlookup->id;
} else {
//no user was found
$avatar = JFusionFunction::getJoomlaURL() . 'components/com_jfusion/images/noavatar.png';
return $avatar;
}
}
if ($software == 'cb') {
$query = 'SELECT avatar FROM #__comprofiler WHERE user_id = '.$uid;
$db->setQuery($query);
$result = $db->loadResult();
if (!empty($result)) {
$avatar = JFusionFunction::getJoomlaURL() . 'images/comprofiler/'.$result;
} else {
$avatar = JFusionFunction::getJoomlaURL() . 'components/com_comprofiler/plugin/templates/default/images/avatar/nophoto_n.png';
}
} elseif ($software == 'jomsocial') {
$query = 'SELECT avatar FROM #__community_users WHERE userid = '.$uid;
$db->setQuery($query);
$result = $db->loadResult();
if (!empty($result)) {
$avatar = JFusionFunction::getJoomlaURL() . $result;
} else {
$avatar = JFusionFunction::getJoomlaURL() . 'components/com_community/assets/default_thumb.jpg';
}
} elseif ($software == 'joomunity') {
$query = 'SELECT user_picture FROM #__joom_users WHERE user_id = '.$uid;
$db->setQuery($query);
$result = $db->loadResult();
$avatar = JFusionFunction::getJoomlaURL() . 'components/com_joomunity/files/avatars/' . $result;
} elseif ($software == 'gravatar') {
$query = 'SELECT email FROM #__users WHERE id = '.$uid;
$db->setQuery($query);
$email = $db->loadResult();
$avatar = 'http://www.gravatar.com/avatar.php?gravatar_id=' . md5(strtolower($email)) . '&size=40';
} else {
$avatar = JFusionFunction::getJoomlaURL() . 'components/com_jfusion/images/noavatar.png';
}
return $avatar;
}
/**
* Gets the source_url from the joomla_int plugin
*
* @return string Joomla source URL
*/
public static function getJoomlaURL()
{
static $joomla_source_url;
if (empty($joomla_source_url)) {
$params = JFusionFactory::getParams('joomla_int');
$joomla_source_url = $params->get('source_url');
}
return $joomla_source_url;
}
/**
* Gets the base url of a specific menu item
*
* @param int $itemid int id of the menu item
* @param boolean $xhtml return URL with encoded ampersands
*
* @return string parsed base URL of the menu item
*/
public static function getPluginURL($itemid, $xhtml = true)
{
static $jfusionPluginURL;
if (!is_array($jfusionPluginURL)) {
$jfusionPluginURL = array();
}
if (!isset($jfusionPluginURL[$itemid])) {
$joomla_url = JFusionFunction::getJoomlaURL();
$baseURL = JRoute::_('index.php?option=com_jfusion&Itemid=' . $itemid, false);
if (!strpos($baseURL, '?')) {
$baseURL = preg_replace('#\.[\w]{3,4}\z#is', '', $baseURL);
if (substr($baseURL, -1) != '/') {
$baseURL.= '/';
}
}
$juri = new JURI($joomla_url);
$path = $juri->getPath();
if ($path != '/') {
$baseURL = str_replace($path, '', $baseURL);
}
if (substr($joomla_url, -1) == '/') {
if ($baseURL[0] == '/') {
$baseURL = substr($joomla_url, 0, -1) . $baseURL;
} else {
$baseURL = $joomla_url . $baseURL;
}
} else {
if ($baseURL[0] == '/') {
$baseURL = $joomla_url . $baseURL;
} else {
$baseURL = $joomla_url . '/' . $baseURL;
}
}
$jfusionPluginURL[$itemid] = $baseURL;
}
//let's clean up the URL here before passing it
if($xhtml) {
$url = str_replace('&', '&', $jfusionPluginURL[$itemid]);
} else {
$url = $jfusionPluginURL[$itemid];
}
return $url;
}
/**
* hides sensitive information
*
* @param object $userinfo userinfo
*
* @return string parsed userinfo object
*/
public static function anonymizeUserinfo($userinfo)
{
if ( is_object($userinfo) ) {
$userclone = clone $userinfo;
$userclone->password_clear = '******';
if (isset($userclone->password)) {
$userclone->password = substr($userclone->password, 0, 6) . '********';
}
if (isset($userclone->password_salt)) {
$userclone->password_salt = substr($userclone->password_salt, 0, 4) . '*****';
}
} else {
$userclone = $userinfo;
}
return $userclone;
}
/**
* checks if the user is an admin
*
* @return boolean to indicate admin status
*/
public static function isAdministrator()
{
$mainframe = JFactory::getApplication();
if ($mainframe->isAdmin()) {
//we are on admin side, lets confirm that the user has access to user manager
$juser = JFactory::getUser();
if (JFusionFunction::isJoomlaVersion()) {
if ($juser->authorise('core.manage', 'com_users')) {
$debug = true;
} else {
$debug = false;
}
} else {
if ($juser->authorize('com_users', 'manage')) {
$debug = true;
} else {
$debug = false;
}
}
} else {
$debug = false;
}
return $debug;
}
/**
* Converts a string to all ascii characters
*
* @param string $input str to convert
*
* @return string converted string
*/
public static function strtoascii($input)
{
$output = '';
foreach (str_split($input) as $char) {
$output.= '&#' . ord($char) . ';';
}
return $output;
}
/**
* Retrieves the current timezone based on user preference
* Defaults to Joomla global config for timezone
* Hopefully the need for this will be deprecated in Joomla 1.6
*
* @return timezone in -6 format
*/
public static function getJoomlaTimezone()
{
static $timezone;
if (!isset($timezone)) {
$mainframe = JFactory::getApplication();
$timezone = $mainframe->getCfg('offset');
$JUser = JFactory::getUser();
if (!$JUser->guest) {
$timezone = $JUser->getParam('timezone', $timezone);
}
}
return $timezone;
}
/**
* Returns value from version_compare what version joomla is
*
* @param string $v version to check
* @param string $jname name of joomla_ext plugin
*
* @return true/false
*/
public static function isJoomlaVersion($v='1.6',$jname='joomla_int') {
static $versions;
if (!isset($versions[$jname][$v])) {
if ($jname=='joomla_int') {
//file has now moved in Joomla 2.5
//manual include added as JImport has strange behaviours when called from outside core
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');
}
}
$version = new JVersion;
if (version_compare($version->getShortVersion(), $v) >= 0) {
$versions[$jname][$v] = true;
} else {
$versions[$jname][$v] = false;
}
} else {
/**
* @ignore
* @var $admin JFusionAdmin_joomla_ext
*/
$admin = JFusionFactory::getAdmin($jname);
$version = $admin->getVersion();
if (version_compare($version, $v) >= 0) {
$versions[$jname][$v] = true;
} else {
$versions[$jname][$v] = false;
}
}
}
return $versions[$jname][$v];
}
/**
* return the correct usergroups for a given user
*
* @param string $jname plugin name
* @param object|null $userinfo user with correct usergroups, if null it will return the usergroup for new users
*
* @return array
*/
public static function getCorrectUserGroups($jname,$userinfo) {
$params = JFusionFactory::getParams($jname);
$usergroups = $params->get('usergroup',null);
$multiusergroup = $params->get('multiusergroup',null);
$group = array();
if ($usergroups !== null) {
if ($userinfo === null) {
if (substr($usergroups, 0, 2) != 'a:') {
$group = array($usergroups);
}
} else {
$usergroups = (substr($usergroups, 0, 2) == 'a:') ? unserialize($usergroups) : $usergroups;
if (is_array($usergroups) ) {
if (isset($userinfo->group_id) && isset($usergroups[$userinfo->group_id])) {
$usergroup = $usergroups[$userinfo->group_id];
if (is_array($usergroup)) {
//use the first var in the array
$keys = array_keys($usergroup);
$usergroup = $usergroup[$keys[0]];
}
$group = array($usergroup);
}
} else {
$group = array($usergroups);
}
}
} else if ($multiusergroup !== null) {
$master = JFusionFunction::getMaster();
$multiusergroupdefault = $params->get('multiusergroupdefault');
$multiusergroup = (substr($multiusergroup, 0, 2) == 'a:') ? unserialize($multiusergroup) : $multiusergroup;
if (!is_array($multiusergroup)) {
$group = array($multiusergroup);
} else {
$groups = array();
if ($userinfo) {
if (isset($userinfo->groups)) {
$groups = $userinfo->groups;
} elseif (isset($userinfo->group_id)) {
$groups[] = $userinfo->group_id;
}
}
$mastergroups = isset($multiusergroup[$master->name]) ? $multiusergroup[$master->name] : array();
$slavegroups = isset($multiusergroup[$jname]) ? $multiusergroup[$jname] : array();
foreach ($mastergroups as $key => $mastergroup) {
if ( count($mastergroup) == count($groups) ) {
$count = 0;
foreach ($mastergroup as $value) {
if (in_array($value, $groups, true)) {
$count++;
}
}
if (count($groups) == $count ) {
$group = $slavegroups[$key];
break;
}
}
}
if (!count($group) && isset($slavegroups[$multiusergroupdefault])) {
$group = $slavegroups[$multiusergroupdefault];
}
}
}
return $group;
}
/**
* compare set of usergroup with a user returns true if the usergroups are correct
*
* @param object $userinfo user with current usergroups
* @param array $usergroups array with the correct usergroups
*
* @return true/false
*/
public static function compareUserGroups($userinfo,$usergroups) {
if (!is_array($usergroups)) {
$usergroups = array($usergroups);
}
$correct = false;
if (isset($userinfo->groups)) {
$count = 0;
if ( count($usergroups) == count($userinfo->groups) ) {
foreach ($usergroups as $key => $group) {
if (in_array($group, $userinfo->groups, true)) {
$count++;
}
}
if (count($userinfo->groups) == $count) {
$correct = true;
}
}
} else {
foreach ($usergroups as $key => $group) {
if ($group == $userinfo->group_id) {
$correct = true;
break;
}
}
}
return $correct;
}
/**
* returns true / false if the plugin is in advanced usergroup mode or not...
*
* @param string $jname plugin name
*
* @return true/false
*/
public static function isAdvancedUsergroupMode($jname) {
static $advanced = array();
if (!isset($advanced[$jname])) {
$params = JFusionFactory::getParams($jname);
$usergroup = $params->get('usergroup');
$multiusergroup = $params->get('multiusergroup');
if (substr($usergroup, 0, 2) == 'a:' || substr($multiusergroup, 0, 2) == 'a:') {
$advanced[$jname] = true;
} else {
$advanced[$jname] = false;
}
}
return $advanced[$jname];
}
/**
* @static
* @param $extension
* @param $type
* @param $name
* @param null $basePath
*
* @return bool
*/
public static function loadLanguage($extension,$type,$name, $basePath = null){
$extension = $extension.'_'.$type.'_'.$name;
if(JFusionFunction::isJoomlaVersion('1.6')) {
if ($basePath == null) {
$basePath = JPATH_ADMINISTRATOR;
}
$lang = JFactory::getLanguage();
return $lang->load(strtolower($extension), $basePath, null, false, false)
|| $lang->load(strtolower($extension), JPATH_PLUGINS .DS.$type.DS.$name, null, false, false)
|| $lang->load(strtolower($extension), $basePath, $lang->getDefault(), false, false)
|| $lang->load(strtolower($extension), JPATH_PLUGINS .DS.$type.DS.$name, $lang->getDefault(), false, false);
} else {
if ($basePath == null) {
$basePath = JPATH_BASE;
}
jimport('joomla.plugin.plugin');
JPlugin::loadLanguage($extension, $basePath);
}
return false;
}
/**
* Convert a utf-8 joomla string in to a valid encoding matching the table/filed it will be sent to
*
* @static
* @param string $string string to convert
* @param string $jname used to get the database object, and point to the static stored data
* @param string $table table that we will be looking at
* @param string $field field that we will be looking at
*
* @return bool|string
*/
public static function encodeDBString($string, $jname, $table, $field) {
static $data;
$data = array();
if (!isset($data[$jname][$table])) {
$db = JFusionFactory::getDatabase($jname);
$query = 'SHOW FULL FIELDS FROM '.$table;
$db->setQuery($query);
$fields = $db->loadObjectList();
foreach ($fields as $f) {
if ($f->Collation) {
$data[$jname][$table][$f->Field] = $f->Collation;
}
}
}
if (isset($data[$jname][$table][$field]) ) {
list($charset) = explode('_', $data[$jname][$table][$field]);
switch ($charset) {
case 'latin1':
$encoding = 'ISO-8859-1';
break;
case 'utf8':
//do nothing
break;
default:
JError::raiseError(500, 'JFusion Encoding support missing: '.$charset);
break;
}
if (isset($encoding)) {
$converted = false;
if (function_exists ('iconv')) {
$converted = iconv('utf-8', $encoding, $string);
} else if (function_exists('mb_convert_encoding')) {
$converted = mb_convert_encoding($string, $encoding, 'utf-8');
} else {
JError::raiseError(500, 'JFusion: missing iconv or mb_convert_encoding');
}
if ($converted !== false) {
$string = $converted;
} else {
JError::raiseError(500, 'JFusion Encoding failed '.$charset);
}
}
}
return $string;
}
/**
* @static
* @param $matches
*
* @return string
*/
public static function _callback_htmlspecialchars($matches)
{
return htmlspecialchars($matches[1], ENT_QUOTES, 'UTF-8');
}
/**
* @static
* @param $matches
*
* @return string
*/
public static function _callback_code($matches)
{
return '[code]'.htmlspecialchars($matches[2], ENT_QUOTES, 'UTF-8').'[/code]';
}
/**
* @static
* @param $matches
*
* @return string
*/
public static function _callback_code_decode($matches)
{
return '[code]'.htmlspecialchars_decode($matches[1], ENT_QUOTES).'[/code]';
}
/**
* @static
* @param $matches
*
* @return string
*/
public static function _callback_parseTag_img($matches)
{
return '[img]'.JFusionFunction::parseTag($matches[1],'img').'[/img]';
}
/**
* @static
* @param $matches
*
* @return string
*/
public static function _callback_parseTag_p($matches)
{
return JFusionFunction::parseTag($matches[1], 'p');
}
/**
* @static
* @param $matches
*
* @return string
*/
public static function _callback_url($matches)
{
return '[url='.JRoute::_(JFusionFunction::getJoomlaURL().$matches[1]).']'.$matches[2].'[/url]';
}
/**
* Check if feature exists
*
* @static
* @param string $jname
* @param string $feature feature
* @param int $itemid itemid
*
* @return bool
*/
public static function hasFeature($jname,$feature,$itemid=null) {
$return = false;
switch ($feature) {
//admin
case 'wizard':
$admin = JFusionFactory::getAdmin($jname);
$return = self::methodDefined($admin,'setupFromPath');
break;
//public
case 'search':
$public = JFusionFactory::getPublic($jname);
$return = (self::methodDefined($public,'getSearchQuery') || self::methodDefined($public,'getSearchResults'));
break;
case 'whosonline':
$public = JFusionFactory::getPublic($jname);
$return = self::methodDefined($public,'getOnlineUserQuery');
break;
case 'breadcrumb':
$public = JFusionFactory::getPublic($jname);
$return = self::methodDefined($public,'getPathWay');
break;
case 'frontendlanguage':
$public = JFusionFactory::getPublic($jname);
$return = self::methodDefined($public,'setLanguageFrontEnd');
break;
case 'frameless':
$public = JFusionFactory::getPublic($jname);
$return = self::methodDefined($public,'getBuffer');
break;
//forum
case 'discussion':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'createThread');
break;
case 'activity':
$forum = JFusionFactory::getForum($jname);
$return = (self::methodDefined($forum,'getActivityQuery') || self::methodDefined($forum,'renderActivityModule'));
break;
case 'threadurl':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getThreadURL');
break;
case 'posturl':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getPostURL');
break;
case 'profileurl':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getProfileURL');
break;
case 'avatarurl':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getAvatar');
break;
case 'privatemessageurl':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getPrivateMessageURL');
break;
case 'viewnewmessagesurl':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getViewNewMessagesURL');
break;
case 'privatemessagecounts':
$forum = JFusionFactory::getForum($jname);
$return = self::methodDefined($forum,'getPrivateMessageCounts');
break;
//user
case 'useractivity':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'activateUser');
break;
case 'duallogin':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'createSession');
break;
case 'duallogout':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'destroySession');
break;
case 'updatepassword':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'updatePassword');
break;
case 'updateusername':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'updateUsername');
break;
case 'updateemail':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'updateEmail');
break;
case 'updateusergroup':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'updateUsergroup');
break;
case 'updateuserlanguage':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'updateUserLanguage');
break;
case 'syncsessions':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'syncSessions');
break;
case 'blockuser':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'blockUser');
break;
case 'activateuser':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'activateUser');
break;
case 'deleteuser':
$user = JFusionFactory::getUser($jname);
$return = self::methodDefined($user,'deleteUser');
break;
case 'redirect_itemid':
if ($itemid) {
$app = JFactory::getApplication();
$menus = $app->getMenu('site');
$item = $menus->getItem($itemid);
if ($item && $item->params->get('visual_integration') == 'frameless') {
$return = true;
}
}
break;
case 'config':
if ($jname=='joomla_int') {
$return = false;
break;
}
case 'any':
$return = true;
break;
}
return $return;
}
/**
* Function to check if a method has been defined inside a plugin like: setupFromPath
*
* @static
* @param object|string $class
* @param $method
*
* @return bool
*/
public static function methodDefined($class,$method) {
if ( is_object($class) ) {
$name = get_class ( $class );
} else {
$name = $class;
}
//if the class name is the abstract class then return false
$abstractClassNames = array('JFusionAdmin', 'JFusionAuth', 'JFusionForum', 'JFusionPublic', 'JFusionUser');
if (in_array($name, $abstractClassNames)) {
$return = false;
} else {
try {
$m = new ReflectionMethod($class, $method);
if ( $m->getDeclaringClass()->getName() == $name ) {
$return = true;
} else {
$return = false;
}
} catch(Exception $e) {
$return = false;
}
}
return $return;
}
/**
* Checks to see if a JFusion plugin is properly configured
*
* @param string $data file path or file content
* @param boolean $isFile load from file
*
* @return JSimpleXMLElement returns true if plugin is correctly configured
*/
public static function getXml($data, $isFile=true)
{
/**
* @ignore
* @var $xml JSimpleXML
* @var $element JSimpleXMLElement
*/
$xml = JFactory::getXMLParser('Simple');
if ($isFile) {
$xml->loadFile($data);
} else {
$xml->loadString($data);
}
$element = null;
if (isset($xml->document)) {
$element = $xml->document;
}
return $element;
}
}