plugin.foundation.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:62k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3. * Joomla/Mambo Community Builder
  4. * @version $Id: plugin.foundation.php 610 2006-12-13 17:33:44Z beat $
  5. * @package Community Builder
  6. * @subpackage plugin.foundation.php
  7. * @author JoomlaJoe and Beat
  8. * @copyright (C) JoomlaJoe and Beat, www.joomlapolis.com
  9. * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
  10. */
  11. // ensure this file is being included by a parent file
  12. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  13. /**
  14.  * CB Functions
  15.  */
  16. /**
  17.  * gets Itemid of CB profile, or by default of homepage
  18.  * @param boolean TRUE if should return "&amp:Itemid...." instead of "&Itemid..." (with FALSE as default), === 0 if return only int
  19.  * @return string "&Itemid=xxx"
  20.  */
  21. function getCBprofileItemid( $htmlspecialchars = false, $defaultItemid = true ) {
  22. global $_CB__Cache_ProfileItemid, $_CB_database, $_CB_framework;
  23. if ( $_CB__Cache_ProfileItemid === null ) {
  24. // if( ! isset( $_REQUEST['Itemid'] ) ) {
  25. $_CB_database->setQuery("SELECT id FROM #__menu WHERE link = 'index.php?option=com_comprofiler' AND published=1 AND access " . ( $_CB_framework->myCmsGid() == 0 ? "= " : "<= " ) . (int) $_CB_framework->myCmsGid() );
  26. $Itemid = (int) $_CB_database->loadResult();
  27. // } else {
  28. // $Itemid = (int) cbGetParam( $_REQUEST, 'Itemid', 0 );
  29. // }
  30. if ( ! $Itemid ) { // if no user profile, try getting itemid of the default list:
  31. $_CB_database->setQuery("SELECT id FROM #__menu WHERE link = 'index.php?option=com_comprofiler&task=usersList' AND published=1 AND access " . ( $_CB_framework->myCmsGid() == 0 ? "= " : "<= " ) . (int) $_CB_framework->myCmsGid() );
  32. $Itemid = (int) $_CB_database->loadResult();
  33. }
  34. if ( ( ! $Itemid ) && $defaultItemid && ( checkJversion() != 1 ) ) {
  35. /** Nope, just use the homepage then. * NO: USE NONE: Homepage itemid isn't appropriate at all ! better use none !
  36. $query = "SELECT id"
  37. . "n FROM #__menu"
  38. . "n WHERE menutype = 'mainmenu'"
  39. . "n AND published = 1"
  40. . "n ORDER BY parent, ordering"
  41. . "n LIMIT 1"
  42. ;
  43. $_CB_database->setQuery( $query );
  44. $Itemid = (int) $_CB_database->loadResult();
  45. */
  46. $Itemid = 0;
  47. }
  48. $_CB__Cache_ProfileItemid = $Itemid;
  49. }
  50. if ( $_CB__Cache_ProfileItemid ) {
  51. if ( is_bool( $htmlspecialchars ) ) {
  52. return ( $htmlspecialchars ? "&amp;" : "&") . "Itemid=" . $_CB__Cache_ProfileItemid;
  53. } else {
  54. return $_CB__Cache_ProfileItemid;
  55. }
  56. } else {
  57. return null;
  58. }
  59. }
  60. /**
  61.  * Includes CB library
  62.  * --- usage: cbimport('cb.xml.simplexml');
  63.  *
  64.  * @param string $path
  65.  */
  66. function cbimport( $lib ) {
  67. global $_CB_framework;
  68. static $imported = array();
  69. if ( ! isset( $imported[$lib] ) ) {
  70. $imported[$lib] = true;
  71. $liblow = strtolower( $lib );
  72. $pathAr = explode( '.', $liblow );
  73. if ( $pathAr[0] == 'language' && in_array( $pathAr[1], array( 'front', 'all' ) ) ) {
  74. $langPath = $_CB_framework->getCfg( 'absolute_path' ) . '/components/com_comprofiler/plugin/language';
  75. $lang = $_CB_framework->getCfg( 'lang' );
  76. if ( ! file_exists( $langPath . '/' . $lang . '/' . $lang.'.php' ) ) {
  77. $lang = 'default_language';
  78. }
  79. include_once( $langPath . '/' . $lang . '/' . $lang . '.php' );
  80. } else {
  81. array_pop( $pathAr );
  82. $filepath = implode( '/', $pathAr ) . (count( $pathAr ) ? '/' : '' ) . $liblow . '.php';
  83. require_once( $_CB_framework->getCfg('absolute_path') . '/administrator/components/com_comprofiler/library/' . $filepath );
  84. }
  85. }
  86. }
  87. /**
  88.  * Does the opposite of htmlspecialchars()
  89.  *
  90.  * @param  string  $text
  91.  * @return string
  92.  */
  93. function cbUnHtmlspecialchars( $text ) {
  94. return str_replace( array( "&amp;", "&quot;", "&#039;", "&lt;", "&gt;" ), array( "&", """, "'", "<", ">" ), $text );
  95. }
  96. /**
  97. * String based find and replace that is case insensitive and works on php4 too
  98. * same as PHP5 str_ireplace()
  99. *
  100. * @param  string  $search   value to look for
  101. * @param  string  $replace  value to replace with
  102. * @param  string  $subject  text to be searched
  103. * @return string            with text searched and replaced
  104. */
  105. function cbstr_ireplace( $search, $replace, $subject ) {
  106. if ( function_exists('str_ireplace') ) {
  107. return str_ireplace($search,$replace,$subject); // php 5 only
  108. }
  109. $srchlen = strlen($search);    // lenght of searched string
  110. $result  = "";
  111. while ( true == ( $find = stristr( $subject, $search ) ) ) { // find $search text in $subject - case insensitiv
  112. $srchtxt = substr($find,0,$srchlen);     // get new case-sensitively-correct search text
  113. $pos  = strpos( $subject, $srchtxt ); // stripos is php5 only...
  114. $result  .= substr( $subject, 0, $pos ) . $replace; // replace found case insensitive search text with $replace
  115. $subject = substr( $subject, $pos + $srchlen );
  116. }
  117. return $result . $subject;
  118. }
  119. /**
  120.  * Translates text strings from CB and core cms ('_UE_....') into current language
  121.  *
  122.  * @param  string  $text
  123.  * @return string
  124.  */
  125. function getLangDefinition($text) {
  126. // check for '::' as a workaround of bug #42770 in PHP 5.2.4 with optimizers:
  127. if ( ( strpos( $text, '::' ) === false ) && defined( $text ) ) {
  128. $returnText = constant( $text ); 
  129. } else {
  130. $returnText = $text;
  131. }
  132. return $returnText;
  133. }
  134. /**
  135.  * Check Mambo/Joomla/others version for API
  136.  *
  137.  * @param  string  $info  'api', 'product', 'release'
  138.  * @return mixed          'api'     : API version: =0 = mambo 4.5.0-4.5.3+Joomla 1.0.x, =1 = Joomla! 1.1, >1 newever ones: maybe compatible, <0: -1: Mambo 4.6
  139.  *                        'product' : product name
  140.  *                        'release' : php-style release number
  141.  */
  142. function checkJversion( $info = 'api' ) {
  143. static $version = array();
  144. if ( isset( $version[$info] ) ) {
  145. return $version[$info];
  146. }
  147. global $_VERSION;
  148. if ( $_VERSION ) {
  149. $VO = $_VERSION;
  150. } elseif ( class_exists( 'JVersion' ) ) {
  151. $VO = new JVersion();
  152. } else {
  153. trigger_error( 'Unable to determine CMS version.', E_USER_ERROR );
  154. die();
  155. }
  156. switch ( $info ) {
  157. case 'api':
  158. if ( $VO->PRODUCT == "Mambo" ) {
  159. if ( strncasecmp( $VO->RELEASE, "4.6", 3 ) < 0 ) {
  160. $version[$info] = 0;
  161. } else {
  162. $version[$info] = -1;
  163. }
  164. } elseif ( $VO->PRODUCT == "Elxis" ) {
  165. $version[$info] = 0;
  166. } elseif ( $VO->PRODUCT == "MiaCMS" ) {
  167. $version[$info] = -1;
  168. } elseif ( ($VO->PRODUCT == "Joomla!") || ($VO->PRODUCT == "Accessible Joomla!") ) {
  169. if (strncasecmp($VO->RELEASE, "1.0", 3)) {
  170. $version[$info] = 1;
  171. } else {
  172. $version[$info] = 0;
  173. }
  174. } else {
  175. $version[$info] = 0;
  176. }
  177. break;
  178. case 'product':
  179. $version[$info] = $VO->PRODUCT;
  180. break;
  181. case 'release':
  182. $version[$info] = $VO->RELEASE;
  183. break;
  184. case 'dev_level':
  185. $version[$info] = $VO->DEV_LEVEL;
  186. break;
  187. default:
  188. break;
  189. }
  190. return $version[$info];
  191. }
  192. /**
  193.  * Utility function to return a value from a named array or a specified default.
  194.  * TO CONTRARY OF MAMBO AND JOOMLA mos Get Param:
  195.  * 1) DOES NOT MODIFY ORIGINAL ARRAY
  196.  * 2) Does sanitize ints
  197.  * 3) Does return default array() for a default value array(0) which indicates sanitizing an array of ints.
  198.  *
  199.  * @param array A named array
  200.  * @param string The key to search for
  201.  * @param mixed The default value to give if no key found
  202.  * @param int An options mask: _MOS_NOTRIM prevents trim, _MOS_ALLOWHTML allows safe html, _MOS_ALLOWRAW allows raw input
  203.  */
  204. define( "_CB_NOTRIM", 0x0001 );
  205. //define( "_MOS_ALLOWHTML", 0x0002 );
  206. define( "_CB_ALLOWRAW", 0x0004 );
  207. function cbGetParam( &$arr, $name, $def=null, $mask=0 ) {
  208. static $noHtmlFilter = null;
  209. if ( isset( $arr[$name] ) ) {
  210.         if ( is_array( $arr[$name] ) ) {
  211.          $ret = array();
  212.          foreach ( array_keys( $arr[$name] ) as $k ) {
  213.          $ret[$k] = cbGetParam( $arr[$name], $k, $def, $mask);
  214.          if ( $def === array( 0 ) ) {
  215.          $ret[$k] = (int) $ret[$k];
  216.          }
  217.          }
  218.         } else {
  219. $ret = $arr[$name];
  220. if ( is_string( $ret ) ) {
  221. if ( ! ( $mask & _CB_NOTRIM ) ) {
  222. $ret = trim( $ret );
  223. }
  224. if ( ! ( $mask & _CB_ALLOWRAW ) ) {
  225. if ( is_null( $noHtmlFilter ) ) {
  226. cbimport( 'phpinputfilter.inputfilter' );
  227. $noHtmlFilter = new CBInputFilter( /* $tags, $attr, $tag_method, $attr_method, $xss_auto */ );
  228. }
  229. $ret = $noHtmlFilter->process( $ret );
  230. }
  231. if ( is_int( $def ) ) {
  232. $ret = (int) $ret;
  233. } elseif ( is_float( $def ) ) {
  234. $ret = (float) $ret;
  235. } elseif ( !  get_magic_quotes_gpc() ) {
  236. $ret = addslashes( $ret );
  237. }
  238. }
  239.         }
  240. return $ret;
  241. } elseif ( false !== ( $firstSeparator = strpos( $name, '[' )  ) ) {
  242. // html-input-name-encoded array selection, e.g. a[b][c]
  243. $indexes = null;
  244. $mainArrName = substr( $name, 0, $firstSeparator );
  245. $count = preg_match_all( '/\[([^\[\]]+)\]/', substr( $name, $firstSeparator ), $indexes );
  246. if ( isset( $arr[$mainArrName] ) && ( $count > 0 ) ) {
  247. $a = $arr[$mainArrName];
  248. for ( $i = 0; $i < ( $count - 1 ); $i++ ) {
  249. if ( ! isset( $a[$indexes[1][$i]] ) ) {
  250. $a = null;
  251. break;
  252. }
  253. $a = $a[$indexes[1][$i]];
  254. }
  255. } else {
  256. $a = null;
  257. }
  258. if ( $a !== null ) {
  259. return cbGetParam( $a, $indexes[1][$i], $def, $mask );
  260. }
  261. }
  262. if ( $def === array( 0 ) ) {
  263. return array();
  264. }
  265. return $def;
  266. }
  267. /**
  268.  * Redirects browser to new $url with a $message .
  269.  * No return from this function !
  270.  *
  271.  * @param  string  $url
  272.  * @param  string  $message
  273.  * @param  string  $messageType  'message', 'error'
  274.  */
  275. function cbRedirect( $url, $message = '', $messageType = 'message' ) {
  276. global $_CB_framework, $_CB_database;
  277. if ( ( $_CB_framework->getCfg( 'debug' ) > 0 ) && ( ob_get_length() || ( $_CB_framework->getCfg( 'debug' ) > 1 ) ) ) {
  278. $outputBufferLength = ob_get_length();
  279. echo '<br /><br /><strong>Site Debug mode: CB redirection';
  280. if ( $message ) {
  281. echo ' with ' . $messageType . ' "' . $message . '"';
  282. }
  283. if ( $outputBufferLength ) {
  284. echo ' <u>without empty output</u>';
  285. }
  286. echo "<br /><p><em>During it's normal operations Community Builder often redirects you between pages and this causes potentially interesting debug information to be missed. "
  287. . "When your site is in debug mode (global joomla/mambo config is site debug ON), some of these automatic redirects are disabled. "
  288. . "This is a normal feature of the debug mode and does not directly mean that you have any problems.</em></p>"
  289. . '</strong>Click this link to proceed with the next page (in non-debug mode this is automatic): ';
  290. echo '<a href="' . $url . '">' . $url . '</a><br /><br /><hr />';
  291. echo $_CB_database->_db->_ticker . ' queries executed'
  292. . '<pre>';
  293.   foreach ( $_CB_database->_db->_log as $k => $sql ) {
  294.   echo $k + 1 . "n" . htmlspecialchars( $sql ) . '<hr />';
  295. }
  296. echo '</hr>'
  297. . '</hr>POST: ';
  298. var_export( $_POST );
  299. echo '</pre>';
  300. die();
  301. } else {
  302. $_CB_framework->redirect( $url, $message, $messageType );
  303. }
  304. }
  305. /**
  306. * Returns full path to template directory
  307. * @param int  DEPRECIATED: info for backwards-compatibility: user interface : 1: frontend, 2: backend (not used anymore)
  308. * @return template directory path with trailing '/'
  309. */
  310. function selectTemplate( ) {
  311. global $_CB_framework, $ueConfig;
  312. if ( $_CB_framework->getUi() == 1 ) {
  313. $templatedir = $ueConfig['templatedir'];
  314. } else {
  315. $templatedir = 'luna';
  316. }
  317. return $_CB_framework->getCfg( 'live_site' ) . '/components/com_comprofiler/plugin/templates/' . $templatedir . '/';
  318. }
  319. function cbSpoofString( $string = null, $secret = null ) {
  320. global $_CB_framework;
  321. $date = date( 'dmY' );
  322. if ( $string === null ) {
  323. $salt = array();
  324. $salt[0] = mt_rand( 1, 2147483647 );
  325. $salt[1] = mt_rand( 1, 2147483647 ); // 2 * 31 bits random
  326. } else {
  327. $salt = sscanf( $string, 'cbm_%08x_%08x' );
  328. if ( $string != sprintf( 'cbm_%08x_%08x_%s', $salt[0], $salt[1], md5( $salt[0] . $date . $_CB_framework->getUi() . $_CB_framework->getCfg( 'db' ) . $_CB_framework->getCfg('secret') . $secret . $salt[1] ) ) ) {
  329. $date = date( 'dmY', time() - 64800 ); // 18 extra-hours of grace after midnight.
  330. }
  331. }
  332. return sprintf( 'cbm_%08x_%08x_%s', $salt[0], $salt[1], md5( $salt[0] . $date . $_CB_framework->getUi() . $_CB_framework->getCfg( 'db' ) . $_CB_framework->getCfg('secret') . $secret . $salt[1] ) );
  333. }
  334. function cbSpoofField() {
  335. return 'cbsecuritym3';
  336. }
  337. /**
  338.  * Computes and returns an antifspoofing additional input tag
  339.  *
  340.  * @return string "<input type="hidden...n" tag
  341.  */
  342. function cbGetSpoofInputTag( $secret = null, $cbSpoofString = null ) {
  343. if ( $cbSpoofString === null ) {
  344. $cbSpoofString = cbSpoofString( null, $secret );
  345. }
  346. return "<input type="hidden" name="" . cbSpoofField() . "" value="" .  $cbSpoofString . "" />n";
  347. }
  348. function _cbjosSpoofCheck($array, $badStrings) {
  349. foreach ($array as $v) {
  350. foreach ($badStrings as $v2) {
  351. if (is_array($v)) {
  352. _cbjosSpoofCheck($v, $badStrings);
  353. } else if (strpos( $v, $v2 ) !== false) {
  354. header( "HTTP/1.0 403 Forbidden" );
  355. exit( _UE_NOT_AUTHORIZED );
  356. }
  357. }
  358. }
  359. }
  360. /**
  361.  * Checks spoof value and other spoofing and injection tricks
  362.  *
  363.  * @param  string   $secret   extra-hashing value for this particular spoofCheck
  364.  * @param  string   $var      'POST', 'GET', 'REQUEST'
  365.  * @param  int      $mode     1: exits with script to display error and go back, 2: returns true or false.
  366.  * @return boolean  or exit   If $mode = 2 : returns false if session expired.
  367.  */
  368. function cbSpoofCheck( $secret = null, $var = 'POST', $mode = 1 ) {
  369. global $_POST, $_GET, $_REQUEST;
  370. if ( _CB_SPOOFCHECKS ) {
  371. if ( $var == 'GET' ) {
  372. $validateValue  = cbGetParam( $_GET,     cbSpoofField(), '' );
  373. } elseif ( $var == 'REQUEST' ) {
  374. $validateValue  = cbGetParam( $_REQUEST, cbSpoofField(), '' );
  375. } else {
  376. $validateValue  = cbGetParam( $_POST,    cbSpoofField(), '' );
  377. }
  378. if ( ( ! $validateValue ) || ( $validateValue != cbSpoofString( $validateValue, $secret ) ) ) {
  379. if ( $mode == 2 ) {
  380. return false;
  381. }
  382. _cbExpiredSessionJSterminate( 200 );
  383. exit;
  384. }
  385. }
  386. // First, make sure the form was posted from a browser.
  387. // For basic web-forms, we don't care about anything
  388. // other than requests from a browser:
  389. if (!isset( $_SERVER['HTTP_USER_AGENT'] )) {
  390. header( 'HTTP/1.0 403 Forbidden' );
  391. exit( _UE_NOT_AUTHORIZED );
  392. }
  393. // Make sure the form was indeed POST'ed:
  394. //  (requires your html form to use: action="post")
  395. if (!$_SERVER['REQUEST_METHOD'] == 'POST' ) {
  396. header( 'HTTP/1.0 403 Forbidden' );
  397. exit( _UE_NOT_AUTHORIZED );
  398. }
  399. // Attempt to defend against header injections:
  400. $badStrings = array(
  401. 'Content-Type:',
  402. 'MIME-Version:',
  403. 'Content-Transfer-Encoding:',
  404. 'bcc:',
  405. 'cc:'
  406. );
  407. // Loop through each POST'ed value and test if it contains
  408. // one of the $badStrings:
  409. foreach ($_POST as $v){
  410. foreach ($badStrings as $v2) {
  411. if (is_array($v)) {
  412. _cbjosSpoofCheck($v, $badStrings);
  413. } else if (strpos( $v, $v2 ) !== false) {
  414. header( "HTTP/1.0 403 Forbidden" );
  415. exit( _UE_NOT_AUTHORIZED );
  416. }
  417. }
  418. }
  419. // Made it past spammer test, free up some memory
  420. // and continue rest of script:
  421. unset( $v, $v2, $badStrings );
  422. return true;
  423. }
  424. function _cbExpiredSessionJSterminate( $code = 403 ) {
  425. if ( $code == 403 ) {
  426. header( 'HTTP/1.0 403 Forbidden' );
  427. }
  428. echo "<script type="text/javascript">alert('" . addslashes( _UE_SESSION_EXPIRED . ' ' . _UE_PLEASE_REFRESH ) . "'); window.history.go(-1);</script> n";
  429. exit;
  430. }
  431. /**
  432.  * CB Classes
  433.  */
  434. /**
  435. * Parameters handler
  436. * @package Joomla/Mambo Community Builder
  437. */
  438. class cbParamsBase {
  439. /** @var object */
  440. var $_params = null;
  441. /** @var string The raw params string */
  442. var $_raw = null;
  443. /**
  444. * Constructor
  445. * @param string The raw parms text
  446. * @param string Path to the xml setup file
  447. * @param string The type of setup file
  448. */
  449. function cbParamsBase( $paramsValues ) {
  450.     $this->_params = $this->parse( $paramsValues );
  451.     $this->_raw = $paramsValues;
  452. }
  453. /**
  454. * Loads from the plugins database.
  455. * @param string The plugin element name
  456. * @return boolean true: could load, false: query error.
  457. */
  458. function loadFromDB( $element ) {
  459. global $_CB_database;
  460.     $_CB_database->setQuery("SELECT params FROM `#__comprofiler_plugin` WHERE element = '" . $_CB_database->getEscaped( $element ) . "'" );
  461.     $text = $_CB_database->loadResult();
  462.     $this->_params = $this->parse( $text );
  463.     $this->_raw = $text;
  464.     return ( $text !== null );
  465. }
  466. /**
  467. * @param string The name of the param
  468. * @param string The value of the parameter
  469. * @return string The set value
  470. */
  471. function set( $key, $value='' ) {
  472. $this->_params->$key = $value;
  473. return $value;
  474. }
  475. /**
  476. * Sets a default value if not alreay assigned
  477. * @param string The name of the param
  478. * @param string The value of the parameter
  479. * @return string The set value
  480. */
  481. function def( $key, $value='' ) {
  482.     return $this->set( $key, $this->get( $key, $value ) );
  483. }
  484. /**
  485. * @param string The name of the param
  486. * @param mixed The default value if not found
  487. * @return string
  488. */
  489. function get( $key, $default=null ) {
  490.     if ( isset( $this->_params->$key ) ) {
  491.      if (is_array( $default ) ) {
  492.      return explode( '|*|', $this->_params->$key );
  493.      } else {
  494.         return $this->_params->$key;
  495.      }
  496. } else {
  497.     return $default;
  498. }
  499. }
  500. /**
  501. * Parse an .ini string, based on phpDocumentor phpDocumentor_parse_ini_file function
  502. * @param mixed The ini string or array of lines
  503. * @param boolean add an associative index for each section [in brackets]
  504. * @return object
  505. */
  506. function parse( $txt, $process_sections = false, $asArray = false ) {
  507. if (is_string( $txt )) {
  508. $lines = explode( "n", $txt );
  509. } else if (is_array( $txt )) {
  510. $lines = $txt;
  511. } else {
  512. $lines = array();
  513. }
  514. $obj = $asArray ? array() : new stdClass();
  515. $sec_name = '';
  516. $unparsed = 0;
  517. if (!$lines) {
  518. return $obj;
  519. }
  520. foreach ($lines as $line) {
  521. // ignore comments
  522. if ($line && $line[0] == ';') {
  523. continue;
  524. }
  525. $line = trim( $line );
  526. if ($line == '') {
  527. continue;
  528. }
  529. if ($line && $line[0] == '[' && $line[strlen($line) - 1] == ']') {
  530. $sec_name = substr( $line, 1, strlen($line) - 2 );
  531. if ($process_sections) {
  532. if ($asArray) {
  533. $obj[$sec_name] = array();
  534. } else {
  535. $obj->$sec_name = new stdClass();
  536. }
  537. }
  538. } else {
  539. if ( false !== ( $pos = strpos( $line, '=' ) ) ) {
  540. $property = trim( substr( $line, 0, $pos ) );
  541. if (substr($property, 0, 1) == '"' && substr($property, -1) == '"') {
  542. $property = stripcslashes(substr($property,1,count($property) - 2));
  543. }
  544. $value = trim( substr( $line, $pos + 1 ) );
  545. if ($value == 'false') {
  546. $value = false;
  547. }
  548. if ($value == 'true') {
  549. $value = true;
  550. }
  551. if (substr( $value, 0, 1 ) == '"' && substr( $value, -1 ) == '"') {
  552. $value = stripcslashes( substr( $value, 1, count( $value ) - 2 ) );
  553. }
  554. if ($process_sections) {
  555. $value = str_replace( array( 'n', 'r' ), array( "n", "r" ), $value );
  556. if ($sec_name != '') {
  557. if ($asArray) {
  558. $obj[$sec_name][$property] = $value;
  559. } else {
  560. $obj->$sec_name->$property = $value;
  561. }
  562. } else {
  563. if ($asArray) {
  564. $obj[$property] = $value;
  565. } else {
  566. $obj->$property = $value;
  567. }
  568. }
  569. } else {
  570. $value = str_replace( array( 'n', 'r' ), array( "n", "r" ), $value );
  571. if ($asArray) {
  572. $obj[$property] = $value;
  573. } else {
  574. $obj->$property = $value;
  575. }
  576. }
  577. } else {
  578. if ($line && trim($line[0]) == ';') {
  579. continue;
  580. }
  581. if ($process_sections) {
  582. $property = '__invalid' . $unparsed++ . '__';
  583. if ($process_sections) {
  584. if ($sec_name != '') {
  585. if ($asArray) {
  586. $obj[$sec_name][$property] = trim($line);
  587. } else {
  588. $obj->$sec_name->$property = trim($line);
  589. }
  590. } else {
  591. if ($asArray) {
  592. $obj[$property] = trim($line);
  593. } else {
  594. $obj->$property = trim($line);
  595. }
  596. }
  597. } else {
  598. if ($asArray) {
  599. $obj[$property] = trim($line);
  600. } else {
  601. $obj->$property = trim($line);
  602. }
  603. }
  604. }
  605. }
  606. }
  607. }
  608. return $obj;
  609. }
  610. }
  611. /**
  612.  * Lightweight CB user class read-only for use outside CB
  613.  * 
  614.  * @author Beat
  615.  * @license GPL v2
  616.  */
  617. class CBuser {
  618. var $_cbuser;
  619. /** Db
  620.  * @var CBdatabase */
  621. var $_db;
  622. var $_cmsUserTable = '#__users';
  623. var $_cmsUserTableKey = 'id';
  624. /**
  625.  * Constructor
  626.  */
  627. function CBuser( ) {
  628. global $_CB_database, $database;
  629. if ( $_CB_database ) {
  630. $this->_db =& $_CB_database;
  631. } else {
  632. $this->_db =& $database;
  633. }
  634. }
  635. function & getInstance( $userId ) {
  636. static $instances = array();
  637. $userIdInt = (int) $userId;
  638. if ( $userIdInt ) {
  639. if ( ! isset( $instances[$userIdInt] ) ) {
  640. $instances[$userIdInt] =& new CBuser();
  641. $instances[$userIdInt]->load( $userId );
  642. }
  643. return $instances[$userIdInt];
  644. } else {
  645. $cbUser = new CBuser();
  646. return $cbUser;
  647. }
  648. }
  649. function load( $cbUserId ) {
  650. $query = "SELECT *"
  651. . "n FROM #__comprofiler c, " . $this->_cmsUserTable . " u"
  652. . "n WHERE c.id = u." . $this->_cmsUserTableKey
  653. . " AND c.id = " . (int) $cbUserId
  654. ;
  655. $this->_db->setQuery( $query );
  656. return $this->_db->loadObject( $this->_cbuser );
  657. }
  658. function loadCmsUser( $cmsUserId ) {
  659. return $this->load( $cmsUserId ); // for now it's the same but use right one please
  660. }
  661. function loadCbRow( &$row ) {
  662. $this->_cbuser =& $row;
  663. }
  664. function & getUserData( ) {
  665. return $this->_cbuser;
  666. }
  667. /**
  668.  * DO NOT USE: This function will disapear in favor of a new one in very next minor release.
  669.  *
  670.  * @param unknown_type $show_avatar
  671.  * @return unknown
  672.  */
  673. function avatarFilePath( $show_avatar = 2 ) {
  674. global $_CB_framework;
  675. $oValue = null;
  676. if ( $this->_cbuser ) {
  677. $avatar = $this->_cbuser->avatar;
  678. $avatarapproved = $this->_cbuser->avatarapproved;
  679. $absolute_path = $_CB_framework->getCfg( 'absolute_path' );
  680. $live_site = $_CB_framework->getCfg( 'live_site' );
  681. if ( $avatarapproved == 0 ) {
  682. return selectTemplate() . 'images/avatar/tnpending_n.png';
  683. } elseif ( ( $avatar == '' ) && $avatarapproved == 1 ) {
  684. $oValue = null;
  685. } elseif ( strpos( $avatar, 'gallery/' ) === false ) {
  686. $oValue = 'images/comprofiler/tn' . $avatar;
  687. } else {
  688. $oValue = 'images/comprofiler/' . $avatar;
  689. }
  690. if ( ! is_file( $absolute_path . '/' . $oValue ) ) {
  691. $oValue = null;
  692. }
  693. if ( ( ! $oValue ) && ( $show_avatar == 2 ) ) {
  694. return selectTemplate() . 'images/avatar/tnnophoto_n.png';
  695. }
  696. }
  697. if ( $oValue ) {
  698. $oValue = $live_site . '/' . $oValue;
  699. }
  700. return $oValue;
  701. }
  702. /**
  703.  * Replaces [fieldname] by the content of the user row (except for [password])
  704.  *
  705.  * @param  string         $msg
  706.  * @param  boolean|array  $htmlspecialchars  on replaced values only: FALSE : no htmlspecialchars, TRUE: do htmlspecialchars, ARRAY: callback method
  707.  * @param  boolean        $menuStats
  708.  * @param  array          $extraStrings
  709.  * @param  boolean        $translateLanguage  on $msg only
  710.  * @return string
  711.  */
  712. function replaceUserVars( $msg, $htmlspecialchars = true, $menuStats = true, $extraStrings = array(), $translateLanguage = true ){
  713. if ( $translateLanguage ) {
  714. $msg = getLangDefinition( $msg );
  715. }
  716. if ( strpos( $msg, '[' ) === false ) {
  717. return $msg;
  718. }
  719. // $msg = $this->_evaluateTabs( $msg );
  720. $msg = $this->_evaluateIfs( $msg );
  721. $row =& $this->_cbuser;
  722. if ( is_object( $row ) ) {
  723. $array = get_object_vars( $row );
  724. foreach( $array AS $k => $v ) {
  725. if( ( ! is_object( $v ) ) && ( ! is_array( $v ) ) ) {
  726. if ( ! ( ( strtolower( $k ) == "password" ) && ( strlen($v) >= 32 ) ) ) {
  727. /* do not translate content ! :
  728. $vTranslated = ( $translateLanguage ? getLangDefinition( $v ) : $v );
  729. if ( is_array( $htmlspecialchars ) ) {
  730. $vTranslated = call_user_func_array( $htmlspecialchars, array( $vTranslated ) );
  731. }
  732. $msg = cbstr_ireplace("[".$k."]", $htmlspecialchars === true ? htmlspecialchars( $vTranslated ) : $vTranslated, $msg );
  733. */
  734. if ( is_array( $htmlspecialchars ) ) {
  735. $v = call_user_func_array( $htmlspecialchars, array( $v ) );
  736. }
  737. $msg = cbstr_ireplace("[".$k."]", $htmlspecialchars === true ? htmlspecialchars( $v ) : $v, $msg );
  738. }
  739. }
  740. }
  741. }
  742. foreach( $extraStrings AS $k => $v) {
  743. if( ( ! is_object( $v ) ) && ( ! is_array( $v ) ) ) {
  744. /* do not translate content ! :
  745. $vTranslated = ( $translateLanguage ? getLangDefinition( $v ) : $v );
  746. if ( is_array( $htmlspecialchars ) ) {
  747. $vTranslated = call_user_func_array( $htmlspecialchars, array( $vTranslated ) );
  748. }
  749. $msg = cbstr_ireplace("[".$k."]", $htmlspecialchars === true ? htmlspecialchars( $vTranslated ) : $vTranslated, $msg );
  750. */
  751. if ( is_array( $htmlspecialchars ) ) {
  752. $v = call_user_func_array( $htmlspecialchars, array( $v ) );
  753. }
  754. $msg = cbstr_ireplace("[".$k."]", $htmlspecialchars === true ? htmlspecialchars( $v ) : $v, $msg );
  755. }
  756. }
  757. if ( $menuStats ) {
  758. // find [menu .... : path1:path2:path3 /] and replace with HTML code if menu active, otherwise remove it all
  759. $msg = $this->_replacePragma( $msg, $row, 'menu', 'menuBar' );
  760. // no more [status ] as they are standard fields ! $msg = $this->_replacePragma( $msg, $row, 'status', 'menuList' );
  761. }
  762. $msg = str_replace( array( "&91;", "&93;" ), array( "[", "]" ), $msg );
  763. return $msg;
  764. }
  765. /**
  766.  * INTERNAL PRIVATE METHODS:
  767.  */
  768. /**
  769.  * Explodes a text like: href="text1" img="text'it" alt='alt"joe'   into an array with defined keys and values, but null for missing ones.
  770.  * @access private
  771.  *
  772.  * @param string $text text to parse
  773.  * @param array of string $validTags valid tag names
  774.  * @return array of string array( "tagname" => "tagvalue", "notsetTagname" => null)
  775.  */
  776. function _explodeTags( $text, $validTags ) {
  777. $text = trim($text);
  778. $result = array();
  779. foreach ($validTags as $tagName) {
  780. $result[$tagName] = null;
  781. }
  782. while ( $text != "" ) {
  783. $posEqual = strpos( $text, "=" );
  784. if ( $posEqual !== false ) {
  785. $tagName = trim( substr( $text, 0, $posEqual ) );
  786. $text = trim( substr( $text, $posEqual + 1 ) );
  787. $quoteMark = substr( $text, 0, 1);
  788. $posEndQuote = strpos( $text, $quoteMark, 1 );
  789. $tagValue = false;
  790. if ( ($posEndQuote !== false) && in_array( $quoteMark, array( "'", '"' ) ) ) {
  791. $tagValue = substr( $text, 1, $posEndQuote - 1 );
  792. $text = trim( substr( $text, $posEndQuote + 1 ) );
  793. if ( in_array( $tagName, $validTags ) ) {
  794. $result[$tagName] = $tagValue;
  795. }
  796. } else {
  797. break;
  798. }
  799. } else {
  800. break;
  801. }
  802. }
  803. return $result;
  804. }
  805. /**
  806.  * Replaces "$1" in $text with $cbMenuTagsArray[$cbMenuTagsArrayKey] if non-null but doesn't tag if empty
  807.  * otherwise replace by $cbMenu[$cbMenuKey] if set and non-empty
  808.  * @access private
  809.  *
  810.  * @param array of string $cbMenuTagsArray
  811.  * @param string $cbMenuTagsArrayKey
  812.  * @param array of string $cbMenu
  813.  * @param string $cbMenuKey
  814.  * @param string $text
  815.  * @return string
  816.  */
  817. function _placeTags( $cbMenuTagsArray, $cbMenuTagsArrayKey, $cbMenu, $cbMenuKey, $text ) {
  818. if ( $cbMenuTagsArray[$cbMenuTagsArrayKey] !== null) {
  819. if ( $cbMenuTagsArray[$cbMenuTagsArrayKey] != "" ) {
  820. return str_replace( '$1', /*allow tags! htmlspecialchars */ ( $cbMenuTagsArray[$cbMenuTagsArrayKey] ), $text );
  821. } else {
  822. return null;
  823. }
  824. } elseif ( isset($cbMenu[$cbMenuKey]) && ( $cbMenu[$cbMenuKey] !== null ) && ( $cbMenu[$cbMenuKey] !== "" ) ) {
  825. return str_replace( '$1', $cbMenu[$cbMenuKey], $text );
  826. } else {
  827. return null;
  828. }
  829. }
  830. /**
  831.  * Replaces complex pragmas
  832.  *
  833.  * @param  string    $msg
  834.  * @param  stdClass  $row
  835.  * @param  string    $pragma           the tag between the brackets "[$pragma]"
  836.  * @param  string    $position       the CB menu position
  837.  * @param  boolean   $htmlspecialcharsEncoded  True if menu tags should remain htmlspecialchared
  838.  * @return unknown
  839.  */
  840. function _replacePragma( $msg, $row, $pragma, $position, $htmlspecialcharsEncoded = true ) {
  841. global $_PLUGINS;
  842. $msgResult = "";
  843. $pragmaLen = strlen( $pragma );
  844.     while ( ( $foundPosBegin = strpos( $msg, "[" . $pragma ) ) !== false ) {
  845.     $foundPosEnd = strpos( $msg, "[/" . $pragma . "]", $foundPosBegin + $pragmaLen + 1 );
  846. if ( $foundPosEnd !== false ) {
  847. $foundPosTagEnd = strpos( $msg, "]", $foundPosBegin + $pragmaLen + 1 );
  848. if ( ( $foundPosTagEnd !== false ) && ( $foundPosTagEnd < $foundPosEnd ) ) {
  849. // found [menu .... : $cbMenuTreePath /] : check to see if $cbMenuTreePath is in current menu:
  850.      $cbMenuTreePath = substr( $msg, $foundPosTagEnd + 1, $foundPosEnd - ($foundPosTagEnd + 1) );
  851.      $cbMenuTreePathArray = explode( ":", $cbMenuTreePath );
  852.      $pm = $_PLUGINS->getMenus();
  853.      $pmc=count($pm);
  854. for ( $i=0; $i<$pmc; $i++ ) {
  855. if ( $pm[$i]['position'] == $position ) {
  856. $arrayPos = $pm[$i]['arrayPos'];
  857. foreach ( $cbMenuTreePathArray as $menuName ) {
  858. if ( key( $arrayPos ) == trim( $menuName ) ) {
  859. $arrayPos = $arrayPos[key( $arrayPos )];
  860. } else {
  861. // not matching full menu path: check next:
  862. break;
  863. }
  864. }
  865. if ( !is_array( $arrayPos ) ) {
  866. // came to end of path: match found: stop searching:
  867. break;
  868. }
  869. }
  870. }
  871. // replace by nothing in case not found:
  872. $replaceString = "";
  873. if ( $i < $pmc ) {
  874. // found: replace with menu item: first check for qualifiers for special changes:
  875.      $cbMenuTags = substr( $msg, $foundPosBegin + $pragmaLen + 1, $foundPosTagEnd - ($foundPosBegin + $pragmaLen + 1) );
  876.      if ($htmlspecialcharsEncoded) {
  877.      $cbMenuTags = cbUnHtmlspecialchars( $cbMenuTags );
  878.      }
  879. $cbMenuTagsArray = $this->_explodeTags( $cbMenuTags, array( "href", "target", "title", "class", "style", "img", "caption") );
  880. $replaceString .= $this->_placeTags( $cbMenuTagsArray, 'href', $pm[$i], 'url', '<a href="$1"'
  881. . $this->_placeTags( $cbMenuTagsArray, 'target', $pm[$i], 'target', ' target="$1"' )
  882. . $this->_placeTags( $cbMenuTagsArray, 'title', $pm[$i], 'tooltip', ' title="$1"' )
  883. . $this->_placeTags( $cbMenuTagsArray, 'class', $pm[$i], 'undef', ' class="$1"' )
  884. . $this->_placeTags( $cbMenuTagsArray, 'style', $pm[$i], 'undef', ' style="$1"' )
  885. . ">"
  886.   );
  887. $replaceString .= $this->_placeTags( $cbMenuTagsArray, 'img', $pm[$i], 'img', '$1' );
  888. $replaceString .= $this->_placeTags( $cbMenuTagsArray, 'caption', $pm[$i], 'caption', '$1' );
  889. $replaceString .= $this->_placeTags( $cbMenuTagsArray, 'href', $pm[$i], 'url', '</a>' );
  890. /* $this->menuBar->addObjectItem( $pm[$i]['arrayPos'], $pm[$i]['caption'],
  891. isset($pm[$i]['url']) ?$pm[$i]['url'] :"",
  892. isset($pm[$i]['target'])?$pm[$i]['target'] :"",
  893. isset($pm[$i]['img']) ?$pm[$i]['img'] :null,
  894. isset($pm[$i]['alt']) ?$pm[$i]['alt'] :null,
  895. isset($pm[$i]['tooltip'])?$pm[$i]['tooltip']:null,
  896. isset($pm[$i]['keystroke'])?$pm[$i]['keystroke']:null );
  897. */
  898. }
  899. $msgResult .= substr( $msg, 0, $foundPosBegin );
  900. $msgResult .= $replaceString;
  901. $msg = substr( $msg, $foundPosEnd + $pragmaLen + 3 );
  902. //        $srchtxt = "[menu:".$cbMenuTreePath."]";    // get new search text  
  903. //        $msg = str_replace($srchtxt,$replaceString,$msg);    // replace founded case insensitive search text with $replace 
  904. } else {
  905. break;
  906. }
  907.      } else {
  908.      break;
  909.      }
  910.     }
  911.     return $msgResult . $msg;
  912. }
  913. function _evaluateIfs( $input ) {
  914. // $regex = "#[if ([^]]+)](.*?)[/if]#s";
  915. // $regex = '#[indent]((?:[^[]|[(?!/?indent])|(?R))+)[/indent]#s';
  916. $regex = '#[if( +[^]]+)]((?:[^[]|[(?!/?if[^]]*])|(?R))+)[/if]#';
  917. if ( is_array( $input ) ) {
  918. $regex2 = '# +(?:(&&|and||||or|) +)?([^=<!> ]+) *(=|<|>|>=|<=|<>|!=) *"([^"]*)"#';
  919. $conditions = null;
  920. if (preg_match_all( $regex2, $input[1], $conditions ) ) {
  921. $resultsIdx = 0;
  922. $results = array( $resultsIdx => true );
  923. for ( $i = 0, $n = count( $conditions[0] ); $i < $n; $i++ ) {
  924. $operator = $conditions[1][$i];
  925. $field = $conditions[2][$i];
  926. $compare = $conditions[3][$i];
  927. $value = $conditions[4][$i];
  928. if ( $field && isset( $this->_cbuser->$field ) ) {
  929. $var = $this->_cbuser->$field;
  930. } else {
  931. $var = null;
  932. }
  933. switch ( $compare ) {
  934. case '=':
  935. $r = ( $var == $value );
  936. break;
  937. case '<':
  938. $r = ( $var < $value );
  939. break;
  940. case '>':
  941. $r = ( $var > $value );
  942. break;
  943. case '>=':
  944. $r = ( $var >= $value );
  945. break;
  946. case '<=':
  947. $r = ( $var <= $value );
  948. break;
  949. case '<>':
  950. case '!=':
  951. $r = ( $var != $value );
  952. break;
  953. }
  954. if ( in_array( $operator, array( 'or', '||' ) ) ) {
  955. $resultsIdx++;
  956. $results[++$resultsIdx] = true;
  957. }
  958. // combine and:
  959. $results[$resultsIdx] = $results[$resultsIdx] && $r;
  960. }
  961. // combine or:
  962. $r = false;
  963. foreach ( $results as $rr ) {
  964. $r = $r || $rr;
  965. }
  966. $input = ( $r ? $input[2] : '' );
  967. } else {
  968. $input = '';
  969. }
  970. }
  971. return preg_replace_callback( $regex, array( $this, '_evaluateIfs' ), $input );
  972. }
  973. /*
  974. function _evaluateTabs( $input ) {
  975. // $regex = "#[if ([^]]+)](.*?)[/if]#s";
  976. // $regex = '#[indent]((?:[^[]|[(?!/?indent])|(?R))+)[/indent]#s';
  977. $regex = '#[cbtab +([^]]+)]#';
  978. if ( is_array( $input ) ) {
  979. $tabNameId = $input[1];
  980. $regex2 = '# +(?:(&&|and||||or|) +)?([^=<!> ]+) *(=|<|>|>=|<=|<>|!=) *"([^"]*)"#';
  981. $conditions = null;
  982. if (preg_match_all( $regex2, $input[1], $conditions ) ) {
  983. $resultsIdx = 0;
  984. $results = array( $resultsIdx => true );
  985. for ( $i = 0, $n = count( $conditions[0] ); $i < $n; $i++ ) {
  986. $operator = $conditions[1][$i];
  987. $field = $conditions[2][$i];
  988. $compare = $conditions[3][$i];
  989. $value = $conditions[4][$i];
  990. if ( $field && isset( $this->_cbuser->$field ) ) {
  991. $var = $this->_cbuser->$field;
  992. }
  993. switch ( $compare ) {
  994. case '=':
  995. $r = ( $var == $value );
  996. break;
  997. case '<':
  998. $r = ( $var < $value );
  999. break;
  1000. case '>':
  1001. $r = ( $var > $value );
  1002. break;
  1003. case '>=':
  1004. $r = ( $var >= $value );
  1005. break;
  1006. case '<=':
  1007. $r = ( $var <= $value );
  1008. break;
  1009. case '<>':
  1010. case '!=':
  1011. $r = ( $var != $value );
  1012. break;
  1013. }
  1014. if ( in_array( $operator, array( 'or', '||' ) ) ) {
  1015. $resultsIdx++;
  1016. $results[++$resultsIdx] = true;
  1017. }
  1018. // combine and:
  1019. $results[$resultsIdx] = $results[$resultsIdx] && $r;
  1020. }
  1021. // combine or:
  1022. $r = false;
  1023. foreach ( $results as $rr ) {
  1024. $r = $r || $rr;
  1025. }
  1026. $input = ( $r ? $input[2] : '' );
  1027. } else {
  1028. $input = '';
  1029. }
  1030. }
  1031. return preg_replace_callback( $regex, array( $this, '_evaluateTabs' ), $input );
  1032. }
  1033. */
  1034. }
  1035. /**
  1036.  * CB Framework class for Mambo 4.5.2+
  1037.  * @author Beat
  1038.  * @license GPL v2
  1039.  */
  1040. class CBframework {
  1041. /** Base framework class
  1042.  * @var mosMainFrame */
  1043. var $_baseFramework;
  1044. var $_cmsDatabase;
  1045. var $_ui = 1;
  1046. var $_now;
  1047. var $_myId;
  1048. var $_myUsername;
  1049. var $_myUserType;
  1050. var $_myCmsGid;
  1051. var $_myLanguage = null;
  1052. /** php gacl instance:
  1053.  * @var gacl_api $acl */
  1054. var $acl;
  1055. var $_aclParams = array();
  1056. var $_cmsSefFunction;
  1057. var $_sefFuncHtmlEnt;
  1058. var $_cmsUserClassName;
  1059. var $_cmsUserNeedsDb;
  1060. var $_cmsRedirectFunction;
  1061. var $_cbUrlRouting; // = array( 'option' => 'com_comprofiler' )
  1062. var $_outputCharset;
  1063. var $_editorDisplay;
  1064. var $_redirectUrl = null;
  1065. var $_redirectMessage = null;
  1066. var $_redirectMessageType = 'message';
  1067. function CBframework( &$baseFramework, &$database, &$acl, &$aclParams, $cmsSefFunction, $sefFuncHtmlEnt, $cmsUserClassName, $cmsUserNeedsDb, $cmsRedirectFunction, $myId, $myUsername, $myUserType, $myCmsGid, $myLanguage, $cbUrlRouting, $outputCharset, $editorDisplay ) {
  1068. $this->_baseFramework =& $baseFramework;
  1069. $this->_cmsDatabase =& $database;
  1070. $this->acl =& $acl;
  1071. $this->_aclParams =& $aclParams;
  1072. $this->_cmsSefFunction = $cmsSefFunction;
  1073. $this->_cmsUserClassName = $cmsUserClassName;
  1074. $this->_cmsUserNeedsDb = $cmsUserNeedsDb;
  1075. $this->_cmsRedirectFunction = $cmsRedirectFunction;
  1076. $this->_myId = (int) $myId;
  1077. $this->_myUsername = $myUsername;
  1078. $this->_myUserType = $myUserType;
  1079. $this->_myCmsGid = $myCmsGid;
  1080. $this->_myLanguage = $myLanguage;
  1081. $this->_cbUrlRouting = $cbUrlRouting;
  1082. $this->_outputCharset = $outputCharset;
  1083. $this->_editorDisplay = $editorDisplay;
  1084. $this->_now = time();
  1085. }
  1086. function login( $username, $password, $rememberme = 0, $userId = null ) {
  1087. // Mambo 4.5.x and Joomla before 1.0.13+ (in fact RC3+) do need hashed password for login() method:
  1088. $hashedPwdLogin = ( ( checkJversion() == 0 ) && ! function_exists( 'josHashPassword' ) ); // more reliable version-checking than the often hacked version.php file!
  1089. header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');              // needed for IE6 to accept this anti-spam cookie in higher security setting.
  1090. if ( $hashedPwdLogin ) { // Joomla 1.0.12 and below:
  1091. return $this->_baseFramework->login( $username, cbHashPassword( $password ), $rememberme, $userId );
  1092. } elseif ( checkJversion() == 1 ) { // Joomla 1.5 RC and above:
  1093. return $this->_baseFramework->login( array( 'username' => $username, 'password' => $password ), array( 'remember' => $rememberme ) );
  1094. } else {
  1095. return $this->_baseFramework->login( $username, $password, $rememberme, $userId );
  1096. }
  1097. }
  1098. function logout() {
  1099. header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');              // needed for IE6 to accept this anti-spam cookie in higher security setting.
  1100. $this->_baseFramework->logout();
  1101. }
  1102. function getCfg( $config ) {
  1103. switch ( $config ) {
  1104. case 'absolute_path':
  1105. if ( checkJversion() == 1 ) {
  1106. return JPATH_SITE;
  1107. }
  1108. break;
  1109. case 'live_site':
  1110. if ( checkJversion() == 1 ) {
  1111. if ( $this->getUi() == 1 ) {
  1112. $live_site = JURI::base();
  1113. } else {
  1114. $live_site = $this->_baseFramework->getSiteURL();
  1115. }
  1116. if ( substr( $live_site, -1, 1 ) == '/' ) {
  1117. // fix erroneous ending / in some joomla 1.5 versions:
  1118. return substr( $live_site, 0, -1 );
  1119. } else {
  1120. return $live_site;
  1121. }
  1122. }
  1123. break;
  1124. case 'lang':
  1125. return $this->_myLanguage;
  1126. break;
  1127. case 'uniquemail':
  1128. if ( checkJversion() == 1 ) {
  1129. return '1';
  1130. }
  1131. break;
  1132. case 'frontend_userparams':
  1133. if ( checkJversion() == -1 ) {
  1134. return '0';
  1135. }
  1136. // NO break; on purpose for fall-through:
  1137. case 'allowUserRegistration':
  1138. case 'useractivation':
  1139. case 'new_usertype':
  1140. if ( checkJversion() == 1 ) {
  1141. $usersConfig = &JComponentHelper::getParams( 'com_users' );
  1142. $setting = $usersConfig->get( $config );
  1143. if ( ( $config == 'new_usertype' ) && ! $setting ) {
  1144. $setting = 'Registered';
  1145. }
  1146. return $setting;
  1147. } else {
  1148. if ( $config == 'new_usertype' ) {
  1149. return 'Registered';
  1150. }
  1151. }
  1152. break;
  1153. case 'dirperms':
  1154. case 'fileperms':
  1155. if ( checkJversion() == 1 ) {
  1156. return ''; //TBD: these two missing configs should one day go to CB
  1157. }
  1158. break;
  1159. // CB-Specific config params:
  1160. case 'tmp_path':
  1161. $abs_path = $this->getCfg('absolute_path');
  1162. $tmpDir = $abs_path . '/media';
  1163. if ( @is_dir( $tmpDir ) && @is_writable( $tmpDir ) ) {
  1164. return $tmpDir;
  1165. }
  1166. // First try the new PHP 5.2.1+ function:
  1167. if ( function_exists( 'sys_get_temp_dir' ) ) {
  1168. $tmpDir = @sys_get_temp_dir();
  1169. if ( @is_dir( $tmpDir ) && @is_writable( $tmpDir ) ) {
  1170. return $tmpDir;
  1171. }
  1172. }
  1173. // Based on http://www.phpit.net/article/creating-zip-tar-archives-dynamically-php/2/
  1174. $varsToTry = array( 'TMP', 'TMPDIR', 'TEMP' );
  1175. foreach ( $varsToTry as $v ) {
  1176. if ( ! empty( $_ENV[$v] ) ) {
  1177. $tmpDir = realpath( $v );
  1178. if ( @is_dir( $tmpDir ) && @is_writable( $tmpDir ) ) {
  1179. return $tmpDir;
  1180. }
  1181. }
  1182. }
  1183. // Try the CMS cache directory and other directories desperately:
  1184. $tmpDirToTry = array( $this->getCfg( 'cachepath' ), realpath( '/tmp' ), $abs_path.'/tmp', $abs_path.'/images', $abs_path.'/images/stories', $abs_path.'/images/comprofiler' );
  1185. foreach ( $tmpDirToTry as $tmpDir ) {
  1186. if ( @is_dir( $tmpDir ) && @is_writable( $tmpDir ) ) {
  1187. return $tmpDir;
  1188. }
  1189. }
  1190. return null;
  1191. break;
  1192. default:
  1193. break;
  1194. }
  1195. return $this->_baseFramework->getCfg( $config );
  1196. }
  1197. function getUi( ) {
  1198. return $this->_ui;
  1199. }
  1200. function myId( ) {
  1201. return $this->_myId;
  1202. }
  1203. function myUsername( ) {
  1204. return $this->_myUsername;
  1205. }
  1206. function myUserType( ) {
  1207. return $this->_myUserType;
  1208. }
  1209. function myCmsGid( ) {
  1210. return $this->_myCmsGid;
  1211. }
  1212. function _cms_all_acl( ) {
  1213. return $this->_aclParams;
  1214. }
  1215. function _cms_acl( $action ) {
  1216. if ( isset( $this->_aclParams[$action] ) ) {
  1217. return $this->_aclParams[$action];
  1218. }
  1219. trigger_error( 'acl_check undefined', E_USER_ERROR );
  1220. exit;
  1221. }
  1222. /**
  1223.  * Checks rights of user $userType to perform a $action.
  1224.  *
  1225.  * @param  string  $action  'canEditUsers', 'canBlockUsers', 'canManageUsers', 'canReceiveAdminEmails','canInstallPlugins'
  1226.  *                          'canEditOwnContent', 'canAddAllContent', 'canEditAllContent', 'canPublishContent'
  1227.  * @param  string  $userTye
  1228.  * @return boolean           TRUE: Yes, user can do that, FALSE: forbidden.
  1229.  */
  1230. function check_acl( $action, $userTye ) {
  1231. $aclParams = $this->_cms_acl( $action );
  1232. $aclParams[3] = $userTye;
  1233. return ( true == call_user_func_array( array( $this->acl, 'acl_check' ), $aclParams ) );
  1234. }
  1235. function outputCharset( ) {
  1236. return $this->_outputCharset;
  1237. }
  1238. function getUrlRoutingOfCb( ) {
  1239. return $this->_cbUrlRouting;
  1240. }
  1241. function setRedirect( $url, $message = null, $messageType = 'message' ) { // or 'error'
  1242. $this->_redirectUrl = $url;
  1243. $this->_redirectMessage = $message;
  1244. $this->_redirectMessageType = $messageType;
  1245. }
  1246. function redirect( $url = null, $message = null, $messageType = null ) {
  1247. if ( $url ) {
  1248. $this->_redirectUrl = $url;
  1249. }
  1250. if ( $message !== null ) {
  1251. $this->_redirectMessage = $message;
  1252. }
  1253. if ( $messageType !== null ) {
  1254. $this->_redirectMessageType = $messageType;
  1255. }
  1256. call_user_func_array( $this->_cmsRedirectFunction, array( $this->_redirectUrl, $this->_redirectMessage, $this->_redirectMessageType ) );
  1257. }
  1258. /**
  1259.  * Converts an URL to an absolute URI with SEF format
  1260.  * @param  string  $string  The relative URL
  1261.  * @param  string  $htmlSpecials  TRUE (default): apply htmlspecialchars to sefed URL, FALSE: don't.
  1262.  * @return string           The absolute URL
  1263.  */
  1264. function cbSef( $string, $htmlSpecials = true ) {
  1265. if ( ( $this->getUi() == 1 ) && ( ( $string == '' ) || ( substr( $string, 0, 9 ) == 'index.php' ) || ( $string[0] == '?' ) ) && is_callable( $this->_cmsSefFunction ) ) {
  1266. $uri = call_user_func_array( $this->_cmsSefFunction, array( $this->_sefFuncHtmlEnt ? $string : cbUnHtmlspecialchars( $string ) ) );
  1267. } else {
  1268. $uri = $string;
  1269. }
  1270. if ( ! in_array( substr( $uri, 0, 4 ), array( 'http', 'java' ) ) ) {
  1271. if ( $uri[0] == '/' ) {
  1272. // we got special case of an absolute link without live_site, but an eventual subdirectory of live_site is included...need to strip live_site:
  1273. $matches = array();
  1274. if ( ( preg_match( '!^([^:]+://)([^/]+)(/.*)$!', $this->getCfg( 'live_site' ), $matches ) )
  1275. && ( $matches[3] == substr( $uri, 0, strlen( $matches[3] ) ) ) )
  1276. {
  1277. $uri = $matches[1] . $matches[2] . $uri; // 'http://' . 'site.com' . '/......
  1278. } else {
  1279. $uri = $this->getCfg( 'live_site' ) . $uri;
  1280. }
  1281. } else {
  1282. $uri = $this->getCfg( 'live_site' ) . '/' . $uri;
  1283. }
  1284. }
  1285. if ( ! $htmlSpecials ) {
  1286. $uri = cbUnHtmlspecialchars( $uri );
  1287. } else {
  1288. $uri = htmlspecialchars( cbUnHtmlspecialchars( $uri ) ); // quite a few sefs, including Mambo and Joomla's non-sef are buggy.
  1289. }
  1290. return $uri;
  1291. }
  1292. function userProfileUrl( $userId, $htmlSpecials = true ) {
  1293. if ( $userId == $this->myId() ) {
  1294. $uid = null;
  1295. } else {
  1296. $uid = '&amp;task=userProfile&amp;user=' . $userId;
  1297. }
  1298. return cbSef( 'index.php?option=com_comprofiler&amp;' . $uid . getCBprofileItemid(true), $htmlSpecials );
  1299. }
  1300. function & _getCmsUserObject( $cmsUserId = null ) {
  1301. if ( $this->_cmsUserNeedsDb ) {
  1302. global $_CB_database;
  1303. $obj = new $this->_cmsUserClassName( $_CB_database );
  1304. } else {
  1305. $obj = new $this->_cmsUserClassName();
  1306. }
  1307. if ( $cmsUserId !== null ) {
  1308. if ( ! $obj->load( (int) $cmsUserId ) ) {
  1309. $obj = null;
  1310. }
  1311. }
  1312. return $obj;
  1313. }
  1314. function getUserIdFrom( $field, $value ) {
  1315. global $_CB_database;
  1316. $_CB_database->setQuery( 'SELECT id FROM #__users u WHERE u.' . $_CB_database->NameQuote( $field ) . ' = ' . $_CB_database->Quote( $value )
  1317.  . "n LIMIT 2");
  1318. $results = $_CB_database->loadResultArray();
  1319. if ( $results && ( count( $results ) == 1 ) ) {
  1320. return $results[0];
  1321. }
  1322. return null;
  1323. }
  1324. /**
  1325.  * Returns is user is "online" and last time online of the user
  1326.  *
  1327.  * @param  int  $userId
  1328.  * @return int|null      last online time of the user
  1329.  */
  1330. function userOnlineLastTime( $userId ) {
  1331. global $_CB_database;
  1332. $_CB_database->setQuery( 'SELECT MAX(time) FROM #__session WHERE userid = ' . (int) $userId . ' AND guest = 0');
  1333. $lastTime = $_CB_database->loadResult();
  1334. return $lastTime;
  1335. }
  1336. function displayCmsEditor( $hiddenField, $content, $width, $height, $col, $row ) {
  1337. if ( ! $this->_editorDisplay['returns'] ) {
  1338. ob_start();
  1339. }
  1340. if ( $this->_editorDisplay['display']['args'] == 'withid' ) {
  1341. $args = array( 'editor' . $hiddenField, $content, $hiddenField, $width, $height, $col, $row );
  1342. } else {
  1343. $args = array( $hiddenField, $content, $width, $height, $col, $row );
  1344. }
  1345. $return = call_user_func_array( $this->_editorDisplay['display']['call'], $args );
  1346. if ( ! $this->_editorDisplay['returns'] ) {
  1347. $return = ob_get_contents();
  1348. ob_end_clean();
  1349. }
  1350. return $return;
  1351. }
  1352. function saveCmsEditorJS( $hiddenField ) {
  1353. if ( ! $this->_editorDisplay['returns'] ) {
  1354. ob_start();
  1355. }
  1356. if ( $this->_editorDisplay['save']['args'] == 'withid' ) {
  1357. $args = array( 'editor' . $hiddenField, $hiddenField );
  1358. } else {
  1359. $args = array( $hiddenField );
  1360. }
  1361. $return = call_user_func_array( $this->_editorDisplay['save']['call'], $args );
  1362. if ( ! $this->_editorDisplay['returns'] ) {
  1363. $return = ob_get_contents();
  1364. ob_end_clean();
  1365. }
  1366. return $return;
  1367. }
  1368. /**
  1369.  * Returns the start time of CB's pageload
  1370.  *
  1371.  * @return int     Unix-time in seconds
  1372.  */
  1373. function now( ) {
  1374. return $this->_now;
  1375. }
  1376. function addCustomHeadTag( $tag ) {
  1377. if ( ( $this->getUi() == 1 ) && method_exists( $this->_baseFramework, 'addCustomHeadTag' ) ) {
  1378. return $this->_baseFramework->addCustomHeadTag( $tag );
  1379. } else {
  1380. echo $tag . "n";
  1381. }
  1382. }
  1383. function setPageTitle( $title ) {
  1384. if ( method_exists( $this->_baseFramework, 'setPageTitle' ) ) {
  1385. return $this->_baseFramework->setPageTitle( $title );
  1386. } else {
  1387. return null;
  1388. }
  1389. }
  1390. function appendPathWay( $title ) {
  1391. if ( method_exists( $this->_baseFramework, 'appendPathWay' ) ) {
  1392. return $this->_baseFramework->appendPathWay( $title );
  1393. } else {
  1394. return null;
  1395. }
  1396. }
  1397. function getUserState( $stateName ) {
  1398. return $this->_baseFramework->getUserState( $stateName );
  1399. }
  1400. function getUserStateFromRequest( $stateName, $reqName, $default = null ) {
  1401. return $this->_baseFramework->getUserStateFromRequest( $stateName, $reqName, $default );
  1402. }
  1403. function setUserState( $stateName, $stateValue ) {
  1404. return $this->_baseFramework->setUserState( $stateName, $stateValue );
  1405. }
  1406. function cbset( $name, $value ) {
  1407. $this->$name = $value;
  1408. }
  1409. function outputCbJs( $javascriptCode ) {
  1410. $this->_jsCodes[] = $javascriptCode;
  1411. }
  1412. /**
  1413.  * JS + JQUERY LIB:
  1414.  *
  1415.  */
  1416. var $_jsCodes = array();
  1417. var $_jQueryCodes = array();
  1418. var $_jQueryPlugins = array();
  1419. var $_jqueryDependencies = array( 'ui-all-1.5b3' => array( -1 => array( 'dimensions' ) ), //temporary: change to ui-all when released
  1420. 'flot' => array( 1 => array( 'excanvas' ) ),
  1421. 'rating' => array( -1 => array( 'metadata' ) ) );
  1422. var $_jqueryCssFiles = array( 'lightbox' => array( 'lightbox.css' => 'screen' ) );
  1423. function _coreJQueryFilePath( $jQueryPlugin, $pathType = 'live_site' ) {
  1424. return $this->getCfg( $pathType ) . '/components/com_comprofiler/js/jquery-1.2.6/jquery.' . $jQueryPlugin . ( $this->getCfg( 'debug' ) ? '' : '.pack' ) . '.js';
  1425. }
  1426. /**
  1427.  * Adds an external JQuery plugin to the known JQuery plugins (if not already known)
  1428.  *
  1429.  * @param  string|array   $jQueryPlugins  Short Name of plugin or array of short names
  1430.  * @param  string|boolean $path           Path to file from root of website (not including leading / )
  1431.  * @param  array          $dependencies   array( 1 => array( pluginNames ) ) for plugins to load after and -1 for plugins to load before.
  1432.  * @param  array          $cssfiles       array( filename => media ) : media = null or 'screen'.
  1433.  */
  1434. function addJQueryPlugin( $jQueryPlugins, $path, $dependencies = null, $cssfiles = null ) {
  1435. $jQueryPlugins = (array) $jQueryPlugins;
  1436. foreach ( $jQueryPlugins as $jQueryPlugin ) {
  1437. //temporary:
  1438. if ( $jQueryPlugin == 'ui-all' ) {
  1439. $jQueryPlugin = 'ui-all-1.5b3';
  1440. }
  1441. if ( ( $path === true ) || file_exists( $this->_coreJQueryFilePath( $jQueryPlugin, 'absolute_path' ) ) ) {
  1442. $path = $this->_coreJQueryFilePath( $jQueryPlugin );
  1443. } else {
  1444. $path = $this->getCfg( 'live_site' ) . '/' . $path;
  1445. if ( $dependencies !== null ) {
  1446. $this->_jqueryDependencies = array_merge( $this->_jqueryDependencies, array( $jQueryPlugin => $dependencies ) );
  1447. }
  1448. if ( $cssfiles !== null ) {
  1449. $this->_jqueryCssFiles = array_merge( $this->_jqueryCssFiles, array( $jQueryPlugin => $cssfiles ) );
  1450. }
  1451. }
  1452. if ( ! isset( $this->_jQueryPlugins[$jQueryPlugin] ) ) {
  1453. // not yet configured for loading: check dependencies: -1: before:
  1454. if ( isset( $this->_jqueryDependencies[$jQueryPlugin][-1] ) ) {
  1455. foreach ( $this->_jqueryDependencies[$jQueryPlugin][-1] as $jLib ) {
  1456. if ( ! isset( $this->_jQueryPlugins[$jLib] ) ) {
  1457. $this->_jQueryPlugins[$jLib] = $this->_coreJQueryFilePath( $jLib );
  1458. }
  1459. }
  1460. }
  1461. $this->_jQueryPlugins[$jQueryPlugin] = $path;
  1462. // +1: dependencies after:
  1463. if ( isset( $this->_jqueryDependencies[$jQueryPlugin][1] ) ) {
  1464. foreach ( $this->_jqueryDependencies[$jQueryPlugin][1] as $jLib ) {
  1465. if ( ! isset( $this->_jQueryPlugins[$jLib] ) ) {
  1466. $this->_jQueryPlugins[$jLib] = $this->_coreJQueryFilePath( $jLib );
  1467. }
  1468. }
  1469. }
  1470. }
  1471. }
  1472. }
  1473. /**
  1474.  * Outputs a JQuery init string into JQuery strings at end of page,
  1475.  * and adds if needed JS file inclusions at begin of page.
  1476.  * Pro-memo, JQuery runs in CB in noConflict mode.
  1477.  *
  1478.  * @param  string  $javascriptCode  Javascript code ended by ; which will be put in between jQuery(document).ready(function($){ AND });
  1479.  * @param  string  $jQueryPlugin    (optional) name of plugin to auto-load (if core plugin, or call first addJQueryPlugin).
  1480.  */
  1481. function outputCbJQuery( $javascriptCode, $jQueryPlugin = null ) {
  1482. if ( $jQueryPlugin ) {
  1483. $this->addJQueryPlugin( $jQueryPlugin, true );
  1484. }
  1485. $this->_jQueryCodes[] = $javascriptCode;
  1486. }
  1487. function getAllJsPageCodes( $inHead = false ) {
  1488. global $ueConfig;
  1489. $jsCodeTxt = '';
  1490. // jQuery code loading:
  1491. if ( count( $this->_jQueryCodes ) > 0 ) {
  1492. foreach ( $this->_jQueryPlugins as $plugin => $v ) {
  1493. if ( isset( $this->_jqueryCssFiles[$plugin] ) ) {
  1494. foreach ( $this->_jqueryCssFiles[$plugin] as $templateFile => $media ) {
  1495. outputCbTemplate( $this->getUi(), $templateFile, $media );
  1496. }
  1497. }
  1498. }
  1499. if ( $this->getCfg( 'debug' ) ) {
  1500. $jsCodeTxt .= '<script type="text/javascript" src="' . $this->getCfg('live_site') . '/components/com_comprofiler/js/jquery-1.2.6/jquery-1.2.6.js"></script>';
  1501. } else {
  1502. $jsCodeTxt .= '<script type="text/javascript" src="' . $this->getCfg('live_site') . '/components/com_comprofiler/js/jquery-1.2.6/jquery-1.2.6.pack.js"></script>';
  1503. }
  1504. $jsCodeTxt .= '<script type="text/javascript"><!--//--><![CDATA[//><!--' . "n";
  1505. $jsCodeTxt .= "jQuery.noConflict();n";
  1506. $jsCodeTxt .= "//--><!]]></script>n";
  1507. foreach ( $this->_jQueryPlugins as $plugin => $pluginPath ) {
  1508. $jsCodeTxt .= ( $plugin == 'excanvas' ? '<!--[if IE]>' : '' )
  1509.   . '<script type="text/javascript" src="' . $pluginPath . '"></script>'
  1510.   . ( $plugin == 'excanvas' ? '<![endif]-->' : '' );
  1511. }
  1512. addCbHeadTag( $this->getUi(), $jsCodeTxt ); // files loading in header for speeding up concurrent loading, we need CSS and jQuery before HTML to get onReady event and avoid flicker
  1513. $jsCodeTxt = '';
  1514. /*
  1515. $jsCodeTxt .= "var cbJFrame = window.cbJFrame = function() { return new cbJFrame.prototype.init(); };n"
  1516. . "cbJFrame.fn = cbJFrame.prototype = {n"
  1517. . "  init: function() { return this; },n"
  1518. . "  cbjframe: '" . $ueConfig['version'] . "',n"
  1519. . "  jquery: nulln"
  1520. . "};n"
  1521. . "cbJFrame.prototype.init.prototype = cbJFrame.prototype;n"
  1522. //. "cbJFrame.jquery = jQuery.noConflict();n"
  1523. . 'cbJFrame.jquery(document).ready(function($){' . "n"
  1524. . implode( "n", $this->_jQueryCodes )
  1525. . "});n";
  1526. */
  1527. $jsCodeTxt .= '<script type="text/javascript"><!--//--><![CDATA[//><!--' . "n"
  1528. . 'jQuery(document).ready(function($){' . "n"
  1529. . implode( "n", $this->_jQueryCodes )
  1530. . "});n"
  1531. . "//--><!]]></script>n";
  1532. }
  1533. // classical standalone javascript loading (for compatibility), depreciated ! :
  1534. if ( count( $this->_jsCodes ) > 0 ) {
  1535. $jsCodeTxt .= '<script type="text/javascript"><!--//--><![CDATA[//><!--' . "n"
  1536. . implode( "n", $this->_jsCodes )
  1537. . "//--><!]]></script>n";
  1538. }
  1539. if ( $inHead ) {
  1540. addCbHeadTag( $this->getUi(), $jsCodeTxt );
  1541. return null;
  1542. } else {
  1543. return $jsCodeTxt;
  1544. }
  1545. }
  1546. }
  1547. /**
  1548.  * Converts an absolute URL to SEF format
  1549.  * @param  string  $string  The relative URL
  1550.  * @param  string  $htmlSpecials  TRUE (default): apply htmlspecialchars to sefed URL, FALSE: don't.
  1551.  * @return string           The absolute URL
  1552.  */
  1553. function cbSef( $string, $htmlSpecials = true ) {
  1554. global $_CB_framework;
  1555. return $_CB_framework->cbSef( $string, $htmlSpecials );
  1556. }
  1557. /**
  1558.  * Displays "Not authorized", and if not logged-in "you need to login"
  1559.  *
  1560.  */
  1561. function cbNotAuth() {
  1562. global $_CB_framework;
  1563. echo '<div class="error">' . _UE_NOT_AUTHORIZED . '</div>';
  1564. if ($_CB_framework->myId() < 1 ) {
  1565. echo '<div class="error">' . _UE_DO_LOGIN . '</div>';
  1566. }
  1567. }
  1568. /**
  1569.  * Text classes and old function
  1570.  *
  1571.  */
  1572. class CBTxtStorage {
  1573. var $_iso; // 'UTF-8', 'ISO-8859-1', ...
  1574. var $_mode; // 1: debug, 2: edit
  1575. var $_lang = 'en-GB';
  1576. var $_langOld = 'english';
  1577. var $_strings = array();
  1578. function CBTxtStorage( $iso, $mode ) {
  1579. $this->_iso = $iso;
  1580. $this->_mode = $mode;
  1581. }
  1582. }
  1583. class CBTxt {
  1584. function T( $english ) {
  1585. global $_CB_TxtIntStore;
  1586. if ( $_CB_TxtIntStore->_mode == 0 ) {
  1587. if ( isset( $_CB_TxtIntStore->_strings[$english] ) ) {
  1588. return CBTxt::utf8ToISO( $_CB_TxtIntStore->_strings[$english] );
  1589. } else {
  1590. return $english;
  1591. }
  1592. } else {
  1593. if ( isset( $_CB_TxtIntStore->_strings[$english] ) ) {
  1594. return CBTxt::utf8ToISO( '*' . $_CB_TxtIntStore->_strings[$english] . '*' );
  1595. } else {
  1596. return '===>' . str_replace( '%s', '[%s]', $english ) . '<!---';
  1597. }
  1598. }
  1599. }
  1600. function Th( $english ) {
  1601. global $_CB_TxtIntStore;
  1602. if ( $_CB_TxtIntStore->_mode == 0 ) {
  1603. if ( isset( $_CB_TxtIntStore->_strings[$english] ) ) {
  1604. return CBTxt::utf8ToISO( $_CB_TxtIntStore->_strings[$english] );
  1605. } else {
  1606. return $english;
  1607. }
  1608. } elseif ( $_CB_TxtIntStore->_mode == 1 ) {
  1609. if ( isset( $_CB_TxtIntStore->_strings[$english] ) ) {
  1610. return '<span style="color:#CCC;font-style:italic">' . CBTxt::utf8ToISO( $_CB_TxtIntStore->_strings[$english] ) . '</span>';
  1611. } else {
  1612. return '<span style="color:#FF0000;font-weight:bold">' . '===>' . $english . '<===' . '</span>';
  1613. }
  1614. } else {
  1615. if ( isset( $_CB_TxtIntStore->_strings[$english] ) ) {
  1616. return CBTxt::utf8ToISO( '*' . $_CB_TxtIntStore->_strings[$english] . '*' );
  1617. } else {
  1618. return '===&gt;' . str_replace( '%s', '[%s]', $english ) . '&lt;===';
  1619. }
  1620. }
  1621. }
  1622. function addStrings( &$array ) {
  1623. global $_CB_TxtIntStore;
  1624. $_CB_TxtIntStore->_strings = array_merge( $_CB_TxtIntStore->_strings, $array );
  1625. }
  1626. // Temporary internal functions: do not use !
  1627. function utf8ToISO( $string ) {
  1628. global $_CB_TxtIntStore;
  1629. if ( $_CB_TxtIntStore->_iso == 'UTF-8' ) {
  1630. return $string;
  1631. } elseif ( strncmp( $_CB_TxtIntStore->_iso, 'ISO-8859-1', 9 ) == 0 ) {
  1632. return utf8_decode( $string );
  1633. } else {
  1634. return CBTxt::_unhtmlentities( htmlentities( $string, ENT_NOQUOTES, 'UTF-8' ), ENT_NOQUOTES, $_CB_TxtIntStore->_iso );
  1635. }
  1636. }
  1637. function _unhtmlentities( $string, $quotes = ENT_COMPAT, $charset = "ISO-8859-1" ) {
  1638. $phpv = phpversion();
  1639. if ( version_compare( $phpv, '4.4.3', '<' )
  1640.  || ( version_compare( $phpv, '5.0.0', '>=' ) && version_compare( $phpv, '5.1.3', '<' ) )
  1641.      || ( version_compare( $phpv, '5.0.0', '<'  ) && ( ! in_array( $charset, array( "ISO-8859-1", "ISO-8859-15", "cp866", "cp1251", "cp1252" ) ) ) )
  1642.      || ( version_compare( $phpv, '5.1.3', '>=' ) && ( ! in_array( $charset, array( "ISO-8859-1", "ISO-8859-15", "cp866", "cp1251", "cp1252", 
  1643.          "KOI8-R", "BIG5", "GB2312", "UTF-8", "BIG5-HKSCS", "Shift_JIS", "EUC-JP" ) ) ) )
  1644.    ) {
  1645. // For 4.1.0 =< PHP < 4.3.0 use this function instead of html_entity_decode: also php < 5.0 does not support UTF-8 outputs !
  1646. // Plus up to 4.4.2 and 5.1.2 html_entity_decode is deadly buggy
  1647. $trans_tbl = get_html_translation_table( HTML_ENTITIES );
  1648. if ( $charset == "UTF-8" ) {
  1649. foreach ( $trans_tbl as $k => $v ) {
  1650. $ttr[$v] = utf8_encode($k);
  1651. }
  1652. } else {
  1653. $ttr = array_flip( $trans_tbl );
  1654. }
  1655. return strtr ( $string, $ttr );
  1656. } else  {
  1657. return html_entity_decode ($string, $quotes, $charset);
  1658. }
  1659. }
  1660. }
  1661. /**
  1662.  * CB GLOBALS and initializations
  1663.  */
  1664. // ----- NO MORE CLASSES OR FUNCTIONS PASSED THIS POINT -----
  1665. // Post class declaration initialisations
  1666. // some version of PHP don't allow the instantiation of classes
  1667. // before they are defined
  1668. switch ( checkJversion() ) {
  1669. case 1:
  1670. global $mainframe;
  1671. $database =& JFactory::getDBO();
  1672. $my =& JFactory::getUser();
  1673. $acl =& JFactory::getACL();
  1674. $sefFunc = array( 'JRoute', '_' );
  1675. $sefFuncHtmlEnt = false;
  1676. $cmsUser = 'JUser';
  1677. $cmsUserNeedsDb = false;
  1678. $cmsRedirectFunc = array( $mainframe, 'redirect' );
  1679. $lang =& JFactory::getLanguage();
  1680. $myLanguage = $lang->getBackwardLang();
  1681. $outputCharst = 'UTF-8';
  1682. $editor =& JFactory::getEditor();
  1683. //$editor->initialise();
  1684. $editorDisplay = array( 'display' => array( 'call' => array( $editor , 'display' ), 'args' => 'noid' ),
  1685.    'save'  => array( 'call' => array( $editor , 'save' ), 'args' => 'noid' ),
  1686.    'returns' => true );
  1687. // no$editorDisplay = array( 'JEditor' , 'display' );
  1688. break;
  1689. case 0:
  1690. global $mainframe, $database, $my, $acl;
  1691. $sefFunc = 'sefRelToAbs';
  1692. $sefFuncHtmlEnt = true;
  1693. $cmsUser = 'mosUser';
  1694. $cmsUserNeedsDb = true;
  1695. $cmsRedirectFunc = 'mosRedirect';
  1696. $myLanguage = $mainframe->getCfg( 'lang' );
  1697. $outputCharst = ( defined( '_ISO' ) ? strtoupper( str_replace( "charset=", "", _ISO ) ) : 'ISO-8859-1' );
  1698. $editorDisplay = array( 'display' => array( 'call' => 'editorArea',   'args' => 'withid' ),
  1699.    'save'  => array( 'call' => 'getEditorContents', 'args' => 'withid' ),
  1700.    'returns' => false );
  1701. break;
  1702. case -1:
  1703. default:
  1704. global $mainframe, $database, $my, $acl;
  1705. $sefFunc = 'sefRelToAbs';
  1706. $sefFuncHtmlEnt = true;
  1707. $cmsUser = 'mosUser';
  1708. $cmsUserNeedsDb = true;
  1709. $cmsRedirectFunc = 'mosRedirect';
  1710. $myLanguage = $mainframe->getCfg( 'locale' );
  1711. $outputCharst = ( defined( '_ISO' ) ? strtoupper( str_replace( "charset=", "", _ISO ) ) : 'UTF-8' );
  1712. $editorDisplay = array( 'display' => array( 'call' => 'editorArea',   'args' => 'withid' ),
  1713.    'save'  => array( 'call' => 'getEditorContents', 'args' => 'withid' ),
  1714.    'returns' => false );
  1715. break;
  1716. }
  1717. if ( checkJversion() < 1 ) {
  1718. $aclParams = array( 'canEditUsers' => array( 'administration', 'manage', 'users', null, 'components', 'com_users' ),
  1719. 'canBlockUsers' => array( 'administration', 'edit', 'users', null, 'user properties', 'block_user' ),
  1720. 'canReceiveAdminEmails' => array( 'workflow', 'email_events', 'users', null ),
  1721. 'canEditOwnContent' => array( 'action', 'edit', 'users', null, 'content', 'own' ),
  1722. 'canAddAllContent'  => array( 'action', 'add', 'users', null, 'content', 'all' ),
  1723. 'canEditAllContent'  => array( 'action', 'edit', 'users', null, 'content', 'all' ),
  1724. 'canPublishContent' => array( 'action', 'publish', 'users', null, 'content', 'all' ),
  1725. 'canInstallPlugins' => array( 'administration', 'install', 'users', null, 'components', 'all' ),
  1726. 'canManageUsers' => array( 'administration', 'manage', 'users', null, 'components', 'com_users' )
  1727. );
  1728. } else {
  1729. $aclParams = array( 'canEditUsers' => array( 'com_user', 'edit', 'users', null ),
  1730. 'canBlockUsers' => array( 'com_users', 'block user', 'users', null ),
  1731. 'canReceiveAdminEmails' => array( 'com_users', 'email_events', 'users', null ),
  1732. 'canEditOwnContent' => array( 'com_content', 'edit', 'users', null, 'content', 'own' ),
  1733. 'canAddAllContent'   => array( 'com_content', 'add', 'users', null, 'content', 'all' ),
  1734. 'canEditAllContent'  => array( 'com_content', 'edit', 'users', null, 'content', 'all' ),
  1735. 'canPublishContent' => array( 'com_content', 'publish', 'users', null, 'content', 'all' ),
  1736. 'canInstallPlugins' => array( 'com_installer', 'installer', 'users', null ),
  1737. 'canManageUsers' => array( 'com_users', 'manage', 'users', null )
  1738. );
  1739. }
  1740. /**
  1741.  * CB framework
  1742.  * @global CBframework $_CB_framework
  1743.  */
  1744. global $_CB_framework;
  1745. $optionOfCb = 'com_comprofiler'; // cbGetParam( $_REQUEST, 'option', 'com_comprofiler' )
  1746. $_CB_framework = new CBframework( $mainframe, $database, $acl, $aclParams, $sefFunc, $sefFuncHtmlEnt, $cmsUser, $cmsUserNeedsDb, $cmsRedirectFunc, $my->id, $my->username, $my->usertype, $my->gid, $myLanguage, array( 'option' => $optionOfCb ), $outputCharst, $editorDisplay );
  1747. /**
  1748.  * CB text languages EXPERIMENTAL
  1749.  * @access private
  1750.  * @global CBText $_CB_framework
  1751.  */
  1752. global $_CB_TxtIntStore;
  1753. $_CB_TxtIntStore = new CBTxtStorage( $_CB_framework->outputCharset(), 0 );
  1754. ?>