ConLite/conlite/includes/functions.general.php

2238 Zeilen
66 KiB
PHP
Originalformat Blame Verlauf

<?php
/**
* Project:
* Contenido Content Management System
*
* Description:
* Defines the general contenido functions
*
* @package Contenido Backend includes
* @version $Rev$
* @author Jan Lengowski
* @copyright four for business AG <www.4fb.de>
* @license http://www.contenido.org/license/LIZENZ.txt
* @link http://www.4fb.de
* @link http://www.contenido.org
* @since file available since contenido release <= 4.6
*
* $Id$:
*/
if (!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
/**
* Extracts the available content-types from the database
*
* Creates an array $a_content[type][number] = content string
* f.e. $a_content['CMS_HTML'][1] = content string
* Same for array $a_description
*
* @param int $idartlang Language specific ID of the arcticle
* @return void
*
* @author Jan Lengowski <Jan.Lengowski@4fb.de>
* @copyright four for business AG
*/
function getAvailableContentTypes($idartlang) {
global $db, $cfg, $a_content, $a_description;
$sql = "SELECT
*
FROM
" . $cfg["tab"]["content"] . " AS a,
" . $cfg["tab"]["art_lang"] . " AS b,
" . $cfg["tab"]["type"] . " AS c
WHERE
a.idtype = c.idtype AND
a.idartlang = b.idartlang AND
b.idartlang = '" . Contenido_Security::toInteger($idartlang) . "'";
$db->query($sql);
while ($db->next_record()) {
$a_content[$db->f("type")][$db->f("typeid")] = urldecode($db->f("value"));
$a_description[$db->f("type")][$db->f("typeid")] = i18n($db->f("description"));
}
}
/**
* Checks if an article is assigned to multiple categories
*
* @param int $idart Article-Id
* @return bool Article assigned to multiple categories
*/
function isArtInMultipleUse($idart) {
global $cfg, $client;
$db = new DB_ConLite;
$sql = "SELECT idart FROM " . $cfg["tab"]["cat_art"] . " WHERE idart = '" . Contenido_Security::toInteger($idart) . "'";
$db->query($sql);
return ($db->affected_rows() > 1);
}
/**
* Checks if a value is alphanumeric
*
* @param mixed $test Value to test
* @param bool $umlauts [Use german Umlaute] Optional
* @return bool Value is alphanumeric
*/
function is_alphanumeric($test, $umlauts = true) {
if ($umlauts == true) {
$match = "/^[a-z0-9<><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ]+$/i";
} else {
$match = "/^[a-z0-9 ]+$/i";
}
return (preg_match($match, $test));
}
/**
* Returns multi-language month name (canonical) by its numeric value
*
* @param int $month
* @return string
*/
function getCanonicalMonth($month) {
switch ($month) {
case 1 :
return (i18n("January"));
break;
case 2 :
return (i18n("February"));
break;
case 3 :
return (i18n("March"));
break;
case 4 :
return (i18n("April"));
break;
case 5 :
return (i18n("May"));
break;
case 6 :
return (i18n("June"));
break;
case 7 :
return (i18n("July"));
break;
case 8 :
return (i18n("August"));
break;
case 9 :
return (i18n("September"));
break;
case 10 :
return (i18n("October"));
break;
case 11 :
return (i18n("November"));
break;
case 12 :
return (i18n("December"));
break;
}
}
/**
* Get multi-language day
*
* @param int $iDay The day number of date(w)
* @return string Dayname of current language
*/
function getCanonicalDay($iDay) {
switch ($iDay) {
case 1 :
return (i18n("Monday"));
break;
case 2 :
return (i18n("Tuesday"));
break;
case 3 :
return (i18n("Wednesday"));
break;
case 4 :
return (i18n("Thursday"));
break;
case 5 :
return (i18n("Friday"));
break;
case 6 :
return (i18n("Saterday"));
break;
case 0 :
return (i18n("Sunday"));
break;
default: break;
}
}
/**
* Returns the id of passed area
*
* @param mixed $area Area name
* @return int
*/
function getIDForArea($area) {
global $client, $lang, $cfg, $sess;
$db = new DB_ConLite;
if (!is_numeric($area)) {
$sql = "SELECT
idarea
FROM
" . $cfg["tab"]["area"] . "
WHERE
name = '" . Contenido_Security::escapeDB($area, $db) . "'";
$db->query($sql);
if ($db->next_record()) {
$area = $db->f(0);
}
}
return $area;
}
/**
* Returns the parent id of passed area
*
* @param mixed $area
* @return int
*/
function getParentAreaId($area) {
global $client, $lang, $cfg, $sess;
$db = new DB_ConLite;
if (is_numeric($area)) {
$sql = "SELECT
b.name
FROM
" . $cfg["tab"]["area"] . " AS a,
" . $cfg["tab"]["area"] . " AS b
WHERE
a.idarea = '" . Contenido_Security::toInteger($area) . "' AND
b.name = a.parent_id";
} else {
$sql = "SELECT
b.name
FROM
" . $cfg["tab"]["area"] . " AS a,
" . $cfg["tab"]["area"] . " AS b
WHERE
a.name = '" . Contenido_Security::escapeDB($area, $db) . "' AND
b.name = a.parent_id";
}
$db->query($sql);
if ($db->next_record()) {
return $db->f(0);
} else {
return $area;
}
}
/**
* Write JavaScript to mark
*
* @param int $menuitem Which menuitem to mark
* @param bool $return Return or echo script
*
* @author Jan Lengowski <Jan.Lengowski@4fb.de>
* @copyright four for business AG <www.4fb.de>
*/
function markSubMenuItem($menuitem, $return = false) {
$str = '<script type="text/javascript">
try {
/* Check if we are in a dual-frame or a quad-frame */
if ( parent.parent.frames[0].name == "header")
{
if ( parent.frames["right_top"].document.getElementById("c_' . $menuitem . '") ) {
menuItem = parent.frames["right_top"].document.getElementById("c_' . $menuitem . '").getElementsByTagName(\'a\')[0];
parent.frames["right_top"].sub.clicked(menuItem);
}
} else {
/* Check if submenuItem is existing
and mark it */
if ( parent.parent.frames["right"].frames["right_top"].document.getElementById("c_' . $menuitem . '") ) {
menuItem = parent.parent.frames["right"].frames["right_top"].document.getElementById("c_' . $menuitem . '").getElementsByTagName(\'a\')[0];
parent.parent.frames["right"].frames["right_top"].sub.clicked(menuItem);
}
}
} catch (e)
{}
</script>';
if ($return) {
return $str;
} else {
echo $str;
}
}
/**
* Redirect to main area
*
* @param bool $send Redirect Yes/No
*
* @author Jan Lengowski <Jan.Lengowski@4fb.de>
* @copyright four for business AG <www.4fb.de>
*/
function backToMainArea($send) {
if ($send) {
/* Global vars */
global $area, $cfg, $db, $sess, $idart, $idcat, $idartlang, $idcatart, $frame;
/* Get main area */
$sql = "SELECT
a.name
FROM
" . $cfg["tab"]["area"] . " AS a,
" . $cfg["tab"]["area"] . " AS b
WHERE
b.name = '" . Contenido_Security::escapeDB($area, $db) . "' AND
b.parent_id = a.name";
$db->query($sql);
$db->next_record();
$parent = $db->f("name");
/* Create url string */
$url_str = 'main.php?' . 'area=' . $parent . '&' . 'idcat=' . $idcat . '&' . 'idart=' . $idart . '&' . 'idartlang=' . $idartlang . '&' . 'idcatart=' . $idcatart . '&' . 'force=1&' . 'frame=' . $frame;
$url = $sess->url($url_str);
/* Redirect */
header("location: $url");
}
}
function showLocation($area) {
global $db;
global $cfgPath, $lngArea;
global $cfg;
global $belang;
//Create new xml Class and load the file
$xml = new XML_doc;
if ($xml->load($cfg['path']['xml'] . $cfg['lang'][$belang]) == false) {
if ($xml->load($cfg['path']['xml'] . 'lang_en_US.xml') == false) {
die("Unable to load any XML language file");
}
}
$sql = "SELECT location
FROM " . $cfg["tab"]["area"] . " as A, " . $cfg["tab"]["nav_sub"] . " as B
Where A.name='" . Contenido_Security::escapeDB($area, $db) . "' AND A.idarea=B.idarea AND A.online='1'";
$db->query($sql);
if ($db->next_record()) {
echo "<b>" . $xml->valueOf($db->f("location")) . "</b>";
} else {
$sql = "SELECT parent_id
FROM " . $cfg["tab"]["area"] . "
WHERE name='" . Contenido_Security::escapeDB($area, $db) . "' AND online='1'";
$db->query($sql);
$db->next_record();
$parent = $db->f("parent_id");
$sql = "SELECT location
FROM " . $cfg["tab"]["area"] . " as A, " . $cfg["tab"]["nav_sub"] . " as B
Where A.name='" . Contenido_Security::escapeDB($parent, $db) . "' AND A.idarea = B.idarea AND A.online='1'";
$db->query($sql);
$db->next_record();
echo "<b>" . $xml->valueOf($db->f("location")) . $lngArea[$area] . "</b>";
}
}
function showTable($tablename) {
global $db;
$sql = "SELECT * FROM $tablename";
$db->query($sql);
while ($db->next_record()) {
foreach ($db->Record as $key => $value) {
print (is_string($key) ? "<b>$key</b>: $value | " : "");
}
print ("<br>");
}
}
/**
* Get languages for given client
*
* @deprecated since ConLite version 2.0.0, use method in class cApiLanguageCollection instead
*
* @param int $client
* @return array Array of language ids
*/
function getLanguagesByClient($client) {
$oClLangs = new cApiLanguageCollection();
return $oClLangs->getClientLanguages($client);
}
/**
* Returns all languages (language ids and names) of an client
*
* @param int $client
* @return array List of languages where the key is the language id and value the language name
*/
function getLanguageNamesByClient($client) {
global $db;
global $cfg;
$list = [];
$sql = "SELECT
a.idlang AS idlang,
b.name AS name
FROM
" . $cfg["tab"]["clients_lang"] . " AS a,
" . $cfg["tab"]["lang"] . " AS b
WHERE
idclient='" . Contenido_Security::toInteger($client) . "' AND
a.idlang = b.idlang
ORDER BY
idlang ASC";
$db->query($sql);
while ($db->next_record()) {
$list[$db->f("idlang")] = $db->f("name");
}
return $list;
}
function set_magic_quotes_gpc(&$code) {
$code = addslashes($code);
}
/**
* Returns a list with all clients and languages.
*
* @return array Indexed array where the value is an assoziative array as follows:
* - $arr[0]['idlang']
* - $arr[0]['langname']
* - $arr[0]['idclient']
* - $arr[0]['clientname']
*/
function getAllClientsAndLanguages() {
global $db, $cfg;
$sql = "SELECT
a.idlang as idlang,
a.name as langname,
b.name as clientname,
b.idclient as idclient
FROM
" . $cfg["tab"]["lang"] . " as a,
" . $cfg["tab"]["clients_lang"] . " as c,
" . $cfg["tab"]["clients"] . " as b
WHERE
a.idlang = c.idlang AND
c.idclient = b.idclient";
$db->query($sql);
$aRs = array();
while ($db->next_record()) {
$aRs[] = array(
'idlang' => $db->f('idlang'),
'langname' => $db->f('langname'),
'idclient' => $db->f('idclient'),
'clientname' => $db->f('clientname'),
);
}
return $aRs;
}
function fakeheader($time) {
global $con_time0;
if (!isset($con_time0)) {
$con_time0 = $time;
}
if ($time >= $con_time0 + 1000) {
$con_time0 = $time;
header('X-pmaPing: Pong');
} // end if
}
function recursive_copy($from_path, $to_path) {
$oldumask = umask(0);
if (mkdir($to_path, 0777)) {
umask($oldumask);
$old_path = getcwd();
$this_path = getcwd();
if (is_dir($from_path)) {
chdir($from_path);
$myhandle = opendir('.');
while (($myfile = readdir($myhandle)) !== false) {
if (($myfile != ".") && ($myfile != "..")) {
if (is_dir($myfile)) {
recursive_copy($from_path . $myfile . "/", $to_path . $myfile . "/");
chdir($from_path);
} else if (file_exists($myfile)) {
copy($from_path . $myfile, $to_path . $myfile);
}
}
}
closedir($myhandle);
}
chdir($old_path);
return true;
} else {
umask($oldumask);
return false;
}
}
function getmicrotime() {
list ($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec);
}
/* Small hack to clean up unused sessions.
As we are probably soon rewriting the
session management, this hack is OK. */
function cleanupSessions() {
global $cfg;
$db = new DB_ConLite;
$db2 = new DB_ConLite;
$col = new InUseCollection;
$temp = new Contenido_Challenge_Crypt_Auth;
$maxdate = date("YmdHis", time() - ($temp->lifetime * 60));
/* Expire old sessions */
$sql = "SELECT changed, sid FROM " . $cfg["tab"]["phplib_active_sessions"];
$db->query($sql);
while ($db->next_record()) {
if ($db->f("changed") < $maxdate) {
$sql = "DELETE FROM " . $cfg["tab"]["phplib_active_sessions"] . " WHERE sid = '" . Contenido_Security::escapeDB($db->f("sid"), $db2) . "'";
$db2->query($sql);
$col->removeSessionMarks($db->f("sid"));
}
}
/* Expire invalid InUse-Entries */
$col->select();
while ($c = $col->next()) {
$sql = "SELECT sid FROM " . $cfg["tab"]["phplib_active_sessions"] . " WHERE sid = '" . Contenido_Security::escapeDB($c->get("session"), $db2) . "'";
$db2->query($sql);
if (!$db2->next_record()) {
$col->delete($c->get("idinuse"));
}
}
}
function isGroup($uid) {
$users = new User;
if ($users->loadUserByUserID($uid) == false) {
return true;
} else {
return false;
}
}
function getGroupOrUserName($uid) {
$users = new User;
if ($users->loadUserByUserID($uid) === false) {
$groups = new Group;
/* Yes, it's a group. Let's try to load the group members! */
if ($groups->loadGroupByGroupID($uid) === false) {
return false;
} else {
return substr($groups->getField("groupname"), 4);
}
} else {
return $users->getField("realname");
}
}
/**
* getPhpModuleInfo - parses phpinfo() output
*
* parses phpinfo() output
* (1) get informations for a specific module (parameter $modulname)
* (2) get informations for all modules (no parameter for $modulname needed)
*
* if a specified extension doesn't exists or isn't activated an array will be returned:
* Array
* (
* [error] => extension is not available
* )
*
*
* to get specified information on one module use (1):
* getPhpModuleInfo($moduleName = 'gd');
*
* to get all informations use (2):
* getPhpModuleInfo($moduleName);
*
*
* EXAMPLE OUTPUT (1):
* Array
* (
* [GD Support] => Array
* (
* [0] => enabled
* )
* ...
* )
*
*
* EXAMPLE OUTPUT (2):
* Array
* (
* [yp] => Array
* (
* [YP Support] => Array
* (
* [0] => enabled
* )
*
* )
* ...
* }
*
* foreach ($moduleSettings as $setting => $value)
* $setting contains the modul settings
* $value contains the settings as an array ($value[0] => Local Value && $value[1] => Master Value)
*
* @param $modulName string specify modul name or if not get all settings
*
* @return array see above for example
* @author Marco Jahn
*/
function getPhpModuleInfo($moduleName) {
$moduleSettings = array();
ob_start();
phpinfo(INFO_MODULES); // get information vor modules
$string = ob_get_contents();
ob_end_clean();
$pieces = explode("<h2", $string); // get several modules
foreach ($pieces as $val) {
// perform a regular expression match on every module header
preg_match("/<a name=\"module_([^<>]*)\">/", $val, $sub_key);
// perform a regular expression match on tabs with 2 columns
preg_match_all("/<tr[^>]*>
<td[^>]*>(.*)<\/td>
<td[^>]*>(.*)<\/td>/Ux", $val, $sub);
// perform a regular expression match on tabs with 3 columns
preg_match_all("/<tr[^>]*>
<td[^>]*>(.*)<\/td>
<td[^>]*>(.*)<\/td>
<td[^>]*>(.*)<\/td>/Ux", $val, $sub_ext);
if (isset($moduleName)) { // if $moduleName is specified
if (extension_loaded($moduleName)) { //check if specified extension exists or is loaded
if (!empty($sub_key[1]) && $sub_key[1] == $moduleName) { //create array only for specified $moduleName
foreach ($sub[0] as $key => $val) {
$moduleSettings[strip_tags($sub[1][$key])] = array(strip_tags($sub[2][$key]));
}
}
} else { //specified extension is not loaded or doesn't exists
$moduleSettings['error'] = 'extension is not available';
}
} else { // $moduleName isn't specified => get everything
foreach ($sub[0] as $key => $val) {
$moduleSettings[$sub_key[1]][strip_tags($sub[1][$key])] = array(strip_tags($sub[2][$key]));
}
foreach ($sub_ext[0] as $key => $val) {
$moduleSettings[$sub_key[1]][strip_tags($sub_ext[1][$key])] = array(strip_tags($sub_ext[2][$key]), strip_tags($sub_ext[3][$key]));
}
}
}
return $moduleSettings;
}
function isValidMail($sEMail, $bStrict = false) {
if ($bStrict) {
// HerrB (14.02.2008), code posted by Calvini
// See http://www.contenido.org/forum/viewtopic.php?p=106612#106612
// Note, that IDNs are currently only supported if given as punycode
// "Strict" just means "95% real-world match",
// e.g. a.b@c.de, a-b@c.de, a_b@c.de and some special chars (not \n, ;)
// See also http://www.php.net/manual/en/function.eregi.php#52458,
// but note http://www.php.net/manual/en/function.eregi.php#55215
// or just kill yourself, as being dumb to even try to validate an
// email address: http://www.php.net/manual/en/function.preg-match.php#76615
$sLocalChar = '-a-z0-9_!#\\$&\'\\*\\+\\/=\\?\\^`\\{\\|\\}~';
$sLocalRegEx = '[' . $sLocalChar . '](\\.*[' . $sLocalChar . '])*';
$sDomainChar = 'a-z<><7A><EFBFBD>';
$sDomainRegEx = $sDomainRegEx = '(([' . $sDomainChar . ']|[' . $sDomainChar . '][' . $sDomainChar . '0-9-]{0,61}[' . $sDomainChar . '0-9])\\.)+';
$sTLDChar = 'a-z';
$sTLDRegEx = '[' . $sTLDChar . ']{2,}';
return preg_match('/^' . $sLocalRegEx . '@' . $sDomainRegEx . $sTLDRegEx . '$/i', $sEMail);
} else {
return preg_match("/^[0-9a-z]([-_.]*[0-9a-z]*)*@[a-z0-9-]+\.([a-z])/i", $sEMail);
}
}
function htmldecode($string) {
$trans_tbl = clGetHtmlTranslationTable(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
$ret = strtr($string, $trans_tbl);
return $ret;
}
/**
* build or rebuild array $cfgClient
*
* @global array $cfgClient
* @global int $errsite_idcat
* @global int $errsite_idart
* @global DB_ConLite $db
* @global array $cfg
*/
function rereadClients() {
global $cfgClient;
global $errsite_idcat;
global $errsite_idart;
global $db;
global $cfg;
if (!is_object($db)) {
$db = new DB_ConLite();
}
if (!is_array($cfgClient)) {
$cfgClient = array();
}
$sql = "SELECT
name,
idclient,
frontendpath,
htmlpath,
errsite_cat,
errsite_art
FROM
" . $cfg["tab"]["clients"];
$db->query($sql);
if ($db->affected_rows() <= 0) {
return;
}
while ($db->next_record()) {
$cfgClient["set"] = "set";
$cfgClient[$db->f("idclient")]["name"] = $db->f("name");
$cfgClient[$db->f("idclient")]["errsite"]["idcat"] = $db->f("errsite_cat");
$cfgClient[$db->f("idclient")]["errsite"]["idart"] = $db->f("errsite_art");
$cfgClient[$db->f("idclient")]["images"] = $db->f("htmlpath") . "images/";
$cfgClient[$db->f("idclient")]["upload"] = "upload/";
$cfgClient[$db->f("idclient")]["path"]["frontend"] = $db->f("frontendpath");
$cfgClient[$db->f("idclient")]["path"]["htmlpath"] = $db->f("htmlpath");
$cfgClient[$db->f("idclient")]["htmlpath"]["frontend"] = $cfgClient[$db->f("idclient")]["path"]["htmlpath"];
$cfgClient[$db->f("idclient")]["upl"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "upload/";
$cfgClient[$db->f("idclient")]["upl"]["htmlpath"] = $cfgClient[$db->f("idclient")]["htmlpath"]["frontend"] . "upload/";
$cfgClient[$db->f("idclient")]["upl"]["frontendpath"] = "upload/";
$cfgClient[$db->f("idclient")]["css"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "css/";
$cfgClient[$db->f("idclient")]["js"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "js/";
$cfgClient[$db->f("idclient")]["tpl"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "templates/";
// added new path variables since v2.0.2
$cfgClient[$db->f("idclient")]["cache"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "cache/";
$cfgClient[$db->f("idclient")]["cache"]["frontendpath"] = "cache/";
$cfgClient[$db->f("idclient")]["code"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "cache/code/";
$cfgClient[$db->f("idclient")]["code"]["frontendpath"] = "cache/code/";
$cfgClient[$db->f("idclient")]["xml"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "xml/";
$cfgClient[$db->f("idclient")]["xml"]["frontendpath"] = "xml/";
$cfgClient[$db->f("idclient")]["template"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "templates/";
$cfgClient[$db->f("idclient")]["template"]["frontendpath"] = "templates/";
$cfgClient[$db->f("idclient")]["data"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "data/";
$cfgClient[$db->f("idclient")]["module"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "data/modules/";
$cfgClient[$db->f("idclient")]["module"]["frontendpath"] = "data/modules/";
$cfgClient[$db->f("idclient")]["config"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "data/config/production/";
$cfgClient[$db->f("idclient")]["config"]["frontendpath"] = "data/config/";
$cfgClient[$db->f("idclient")]["layout"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "data/layouts/";
$cfgClient[$db->f("idclient")]["layout"]["frontendpath"] = "data/layouts/";
$cfgClient[$db->f("idclient")]["log"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "data/logs/";
$cfgClient[$db->f("idclient")]["log"]["frontendpath"] = "data/logs/";
$cfgClient[$db->f("idclient")]["version"]["path"] = $cfgClient[$db->f("idclient")]["path"]["frontend"] . "data/version/";
$cfgClient[$db->f("idclient")]["version"]["frontendpath"] = "data/version/";
$errsite_idcat[$db->f("idclient")] = $db->f("errsite_cat");
$errsite_idart[$db->f("idclient")] = $db->f("errsite_art");
}
}
/**
* Sets a system property entry
*
* @modified Timo Trautmann 22.02.2008 Support for editing name and type
*
* @param string $type The type of the item
* @param string $name The name of the item
* @param string $value The value of the item
* @param int $idsystemprop The sysprop id, use optional. If set it allows to modify type name and value
*/
function setSystemProperty($type, $name, $value, $idsystemprop = 0) {
global $cfg;
if ($type == "" || $name == "") {
return false;
}
$idsystemprop = Contenido_Security::toInteger($idsystemprop);
$db_systemprop = new DB_ConLite();
if ($idsystemprop == 0) {
$sql = "SELECT idsystemprop FROM " . $cfg["tab"]["system_prop"] . " WHERE type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "' AND name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "'";
} else {
$sql = "SELECT idsystemprop FROM " . $cfg["tab"]["system_prop"] . " WHERE idsystemprop='$idsystemprop'";
}
$db_systemprop->query($sql);
if ($db_systemprop->num_rows() > 0) {
if ($idsystemprop == 0) {
$sql = "UPDATE " . $cfg["tab"]["system_prop"] . " SET value='" . Contenido_Security::filter($value, $db_systemprop) . "' WHERE type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "'
AND name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "'";
} else {
$sql = "UPDATE " . $cfg["tab"]["system_prop"] . " SET value='" . Contenido_Security::filter($value, $db_systemprop) . "', type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "',
name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "' WHERE idsystemprop='$idsystemprop'";
}
} else {
$idsystemprop = $db_systemprop->nextid($cfg["tab"]["system_prop"]);
$sql = "INSERT INTO " . $cfg["tab"]["system_prop"] . " (idsystemprop, value, type, name) VALUES ('$idsystemprop', '" . Contenido_Security::filter($value, $db_systemprop) . "',
'" . Contenido_Security::escapeDB($type, $db_systemprop) . "', '" . Contenido_Security::escapeDB($name, $db_systemprop) . "')";
}
$db_systemprop->query($sql);
}
/**
* Remove a system property entry
*
* @param string $type The type of the item
* @param string $name The name of the item
*/
function deleteSystemProperty($type, $name) {
global $cfg;
$db_systemprop = new DB_ConLite;
$sql = "DELETE FROM " . $cfg["tab"]["system_prop"] . " WHERE type='" . Contenido_Security::escapeDB($type, $db_systemprop) . "' AND name='" . Contenido_Security::escapeDB($name, $db_systemprop) . "'";
$db_systemprop->query($sql);
}
/**
* Retrieves all available system properties.
* Array format:
*
* $array[$type][$name] = $value;
*
* @modified Timo Trautmann 22.02.2008 Support for editing name and type editing by primaray key idsystemprop
* if bGetPropId is set:
* $array[$type][$name][value] = $value;
* $array[$type][$name][idsystemprop] = $idsystemprop;
*
* @param boolean bGetPropId - if true special mode is activated which generates for each property a third array, which also contains idsystemprop value
* @return array
*/
function getSystemProperties($bGetPropId = 0) {
global $cfg;
$db_systemprop = new DB_ConLite;
$sql = "SELECT idsystemprop, type, name, value FROM " . $cfg["tab"]["system_prop"] . " ORDER BY type ASC, name ASC, value ASC";
$db_systemprop->query($sql);
$results = array();
if ($bGetPropId) {
while ($db_systemprop->next_record()) {
$results[$db_systemprop->f("type")][$db_systemprop->f("name")]['value'] = urldecode($db_systemprop->f("value"));
$results[$db_systemprop->f("type")][$db_systemprop->f("name")]['idsystemprop'] = urldecode($db_systemprop->f("idsystemprop"));
}
} else {
while ($db_systemprop->next_record()) {
$results[$db_systemprop->f("type")][$db_systemprop->f("name")] = urldecode($db_systemprop->f("value"));
}
}
return ($results);
}
/**
* Gets a system property entry
*
* @param string $type The type of the item
* @param string $name The name of the item
* @return mixed boolean false if nothing was found, or
*/
function getSystemProperty($sType, $sName) {
$oProperties = new cApiSystemPropertyCollection();
return $oProperties->getSystemProperty($sType, $sName);
/*
global $cfg;
$db_systemprop = new DB_ConLite;
$sql = "SELECT value FROM ".$cfg["tab"]["system_prop"]." WHERE type='".Contenido_Security::escapeDB($type, $db_systemprop)."' AND name='".Contenido_Security::escapeDB($name, $db_systemprop)."'";
$db_systemprop->query($sql);
if ($db_systemprop->next_record())
{
return urldecode($db_systemprop->f("value"));
} else
{
return false;
} */
}
/**
* Gets system property entries
*
* @param string $type The type of the item
* @return array Value
*/
function getSystemPropertiesByType($sType) {
global $cfg;
$aResult = array();
$db_systemprop = new DB_ConLite;
$sSQL = "SELECT name, value FROM " . $cfg["tab"]["system_prop"] . " WHERE type='" . Contenido_Security::escapeDB($sType, $db_systemprop) . "' ORDER BY name";
$db_systemprop->query($sSQL);
while ($db_systemprop->next_record()) {
$aResult[$db_systemprop->f("name")] = urldecode($db_systemprop->f("value"));
}
return $aResult;
}
/**
* Returns the current effective setting for a property.
*
* The order is:
* System => Client => Group => User
*
* System properties can be overridden by the group, and group
* properties can be overridden by the user.
*
* @param string $type The type of the item
* @param string $name The name of the item
* @param string $default Optional default value
* @return mixed boolean false if nothing was found
*/
function getEffectiveSetting($type, $name, $default = "") {
global $auth, $client, $lang;
if ($auth->auth["uid"] != "nobody") {
$user = new User;
$user->loadUserByUserID($auth->auth["uid"]);
$value = $user->getUserProperty($type, $name, true);
unset($user);
} else {
$value = false;
}
if ($value == false) {
$oClient = new cApiClientLanguage(false, $client, $lang);
$value = $oClient->getProperty($type, $name);
unset($oClient);
}
if ($value == false) {
$oClient = new cApiClient($client);
$value = $oClient->getProperty($type, $name);
unset($oClient);
}
if ($value == false) {
$value = getSystemProperty($type, $name);
}
if ($value === false) {
return $default;
} else {
return $value;
}
}
/**
* Returns the current effective settings for a type of properties.
*
* The order is:
* System => Client => Group => User
*
* System properties can be overridden by the group, and group
* properties can be overridden by the user.
*
* You may use default array to preset settings, this will not override found settings
*
* @version $Rev$
* @author Ortwin Pinke <o.pinke@conlite.org>
*
* @global object $auth
* @global int $client
* @global array $cfg
* @global int $lang
* @param string $sType
* @param array $aDefault
* @return array
*/
function getEffectiveSettingsByType($sType, $aDefault = array()) {
global $auth, $client, $cfg, $lang;
$aResult = getSystemPropertiesByType($sType);
$oClient = new cApiClient($client);
$aResult = array_merge($aResult, $oClient->getPropertiesByType($sType));
unset($oClient);
$oClient = new cApiClientLanguage(false, $client, $lang);
$aResult = array_merge($aResult, $oClient->getPropertiesByType($sType));
unset($oClient);
if ($auth->auth["uid"] != "nobody") {
$oUser = new User;
$oUser->loadUserByUserID($auth->auth["uid"]);
$aResult = array_merge($aResult, $oUser->getUserPropertiesByType($sType, true));
}
if (is_array($aDefault) && count($aDefault) > 0) {
foreach ($aDefault as $sKey => $sValue) {
if (key_exists($sKey, $aResult))
continue;
$aResult[$sKey] = $sValue;
}
}
return $aResult;
}
/**
* retrieve list of article specifications for current client and language
*
* @return array list of article specifications
*/
function getArtspec() {
global $db, $cfg, $lang, $client;
$sql = "SELECT artspec, idartspec, online, artspecdefault FROM " . $cfg['tab']['art_spec'] . "
WHERE client='" . Contenido_Security::toInteger($client) . "' AND lang='" . Contenido_Security::toInteger($lang) . "' ORDER BY artspec ASC";
$db->query($sql);
$artspec = array();
while ($db->next_record()) {
$artspec[$db->f("idartspec")]['artspec'] = $db->f("artspec");
$artspec[$db->f("idartspec")]['online'] = $db->f("online");
$artspec[$db->f("idartspec")]['default'] = $db->f("artspecdefault");
}
return $artspec;
}
/**
* add new article specification
*
* @param string article specification text
*
* @return void
*/
function addArtspec($artspectext, $online) {
global $db, $cfg, $lang, $client;
if (isset($_POST['idartspec'])) { //update
$sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET
artspec='" . Contenido_Security::escapeDB(urldecode($artspectext), $db) . "',
online='" . Contenido_Security::toInteger($online) . "'
WHERE idartspec=" . Contenido_Security::toInteger($_POST['idartspec']) . "";
$db->query($sql);
} else {
$sql = "INSERT INTO " . $cfg['tab']['art_spec'] . "
(idartspec, client, lang, artspec, online, artspecdefault)
VALUES
(" . Contenido_Security::toInteger($db->nextid($cfg['tab']['art_spec'])) . ", '" . Contenido_Security::toInteger($client) . "', '" . Contenido_Security::toInteger($lang) . "',
'" . Contenido_Security::escapeDB(urldecode($artspectext), $db) . "', 0, 0)";
$db->query($sql);
}
}
/**
* delete specified article specification
*
* @param integer article specification id
*
* @return void
*/
function deleteArtspec($idartspec) {
global $db, $cfg;
$sql = "DELETE FROM " . $cfg['tab']['art_spec'] . " WHERE idartspec = '" . Contenido_Security::toInteger($idartspec) . "'";
$db->query($sql);
$sql = "UPDATE " . $cfg["tab"]["art_lang"] . " set artspec = '0' WHERE artspec = '" . Contenido_Security::toInteger($idartspec) . "'";
$db->query($sql);
}
/**
* set article specifications online
*
* flag to switch if an article specification should be shown the frontend or not
*
* @param integer article specification id
* @param integer 0/1 switch the status between on an offline
*
* @return void
*/
function setArtspecOnline($idartspec, $online) {
global $db, $cfg;
$sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET online=" . Contenido_Security::toInteger($online) . " WHERE idartspec=" . Contenido_Security::toInteger($idartspec) . "";
$db->query($sql);
}
/**
* set a default article specification
*
* while creating a new article this defined article specification will be default setting
*
* @param integer article specification id
*
* @return void
*/
function setArtspecDefault($idartspec) {
global $db, $cfg, $lang, $client;
$sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET artspecdefault=0 WHERE client='" . Contenido_Security::toInteger($client) . "' AND lang='" . Contenido_Security::toInteger($lang) . "'";
$db->query($sql);
$sql = "UPDATE " . $cfg['tab']['art_spec'] . " SET artspecdefault=1 WHERE idartspec='" . Contenido_Security::toInteger($idartspec) . "'";
$db->query($sql);
}
/**
* Build a Article select Box
*
* @param String Name of the SelectBox
* @param String Value of the SelectBox
* @return String HTML
*/
function buildArticleSelect($sName, $iIdCat, $sValue) {
global $cfg, $client, $lang, $idcat;
$db = new DB_ConLite;
$html = '';
$html .= '<select id="' . $sName . '" name="' . $sName . '">';
$html .= ' <option value="">' . i18n("Please choose") . '</option>';
$sql = "SELECT b.title, b.idart FROM
" . $cfg["tab"]["art"] . " AS a, " . $cfg["tab"]["art_lang"] . " AS b, " . $cfg["tab"]["cat_art"] . " AS c
WHERE c.idcat = '" . Contenido_Security::toInteger($iIdCat) . "'
AND b.idlang = '" . Contenido_Security::toInteger($lang) . "' AND b.idart = a.idart and b.idart = c.idart
ORDER BY b.title";
$db->query($sql);
while ($db->next_record()) {
if ($sValue != $db->f('idart')) {
$html .= '<option value="' . $db->f('idart') . '" style="background-color:#EFEFEF">' . $db->f('title') . '</option>';
} else {
$html .= '<option value="' . $db->f('idart') . '" style="background-color:#EFEFEF" selected="selected">' . $db->f('title') . '</option>';
}
}
$html .= '</select>';
return $html;
}
/**
* Build a Category / Article select Box
*
* @param String Name of the SelectBox
* @param String Value of the SelectBox
* @param Integer Value of highest level that should be shown
* @param String Optional style informations for select
* @return String HTML
*/
function buildCategorySelect($sName, $sValue, $sLevel = 0, $sStyle = "") {
global $cfg, $client, $lang, $idcat;
$db = new DB_ConLite;
$db2 = new DB_ConLite;
$html = '';
$html .= '<select id="' . $sName . '" style="' . $sStyle . '" name="' . $sName . '">';
$html .= ' <option value="">' . i18n("Please choose") . '</option>';
if ($sLevel > 0) {
$addString = "AND c.level<$sLevel";
}
$sql = "SELECT a.idcat AS idcat, b.name AS name, c.level FROM
" . $cfg["tab"]["cat"] . " AS a, " . $cfg["tab"]["cat_lang"] . " AS b,
" . $cfg["tab"]["cat_tree"] . " AS c WHERE a.idclient = '" . Contenido_Security::toInteger($client) . "'
AND b.idlang = '" . Contenido_Security::toInteger($lang) . "' AND b.idcat = a.idcat AND c.idcat = a.idcat " . Contenido_Security::escapeDB($addString, $db) . "
ORDER BY c.idtree";
$db->query($sql);
$categories = array();
while ($db->next_record()) {
$categories[$db->f("idcat")]["name"] = $db->f("name");
$sql2 = "SELECT level FROM " . $cfg["tab"]["cat_tree"] . " WHERE idcat = '" . Contenido_Security::toInteger($db->f("idcat")) . "'";
$db2->query($sql2);
if ($db2->next_record()) {
$categories[$db->f("idcat")]["level"] = $db2->f("level");
}
$sql2 = "SELECT a.title AS title, b.idcatart AS idcatart FROM
" . $cfg["tab"]["art_lang"] . " AS a, " . $cfg["tab"]["cat_art"] . " AS b
WHERE b.idcat = '" . $db->f("idcat") . "' AND a.idart = b.idart AND
a.idlang = '" . Contenido_Security::toInteger($lang) . "'";
$db2->query($sql2);
while ($db2->next_record()) {
$categories[$db->f("idcat")]["articles"][$db2->f("idcatart")] = $db2->f("title");
}
}
foreach ($categories as $tmpidcat => $props) {
$spaces = "&nbsp;&nbsp;";
for ($i = 0; $i < $props["level"]; $i++) {
$spaces .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
}
$tmp_val = $tmpidcat;
if ($sValue != $tmp_val) {
$html .= '<option value="' . $tmp_val . '" style="background-color:#EFEFEF">' . $spaces . ">" . $props["name"] . '</option>';
} else {
$html .= '<option value="' . $tmp_val . '" style="background-color:#EFEFEF" selected="selected">' . $spaces . ">" . $props["name"] . '</option>';
}
}
$html .= '</select>';
return $html;
}
/**
* getFileExtension
* Returns the file extension of a given file
*
* @param string $filename Name of the file
* @return extension on success, false if no extension could be extracted.
*/
function getFileExtension($filename) {
$dotposition = strrpos($filename, ".");
if ($dotposition !== false) {
return (strtolower(substr($filename, $dotposition + 1)));
} else {
return false;
}
}
function human_readable_size($number) {
$base = 1024;
$suffixes = array(" B", " KB", " MB", " GB", " TB", " PB", " EB");
$usesuf = 0;
$n = (float) $number; //Appears to be necessary to avoid rounding
while ($n >= $base) {
$n /= (float) $base;
$usesuf++;
}
$places = 2 - floor(log10($n));
$places = max($places, 0);
$retval = number_format($n, $places, ".", "") . $suffixes[$usesuf];
return $retval;
}
/**
* Trims an array
*
* @param array Array to trim
* @return array Trimmed array
*/
function trim_array($array) {
if (!is_array($array)) {
return $array;
}
foreach ($array as $key => $value) {
$array[$key] = trim($value);
}
return $array;
}
function array_csort() { //coded by Ichier2003
$args = func_get_args();
$marray = array_shift($args);
$msortline = "return(array_multisort(";
$i = 0;
foreach ($args as $arg) {
$i++;
if (is_string($arg)) {
foreach ($marray as $row) {
$a = strtoupper($row[$arg]);
$sortarr[$i][] = $a;
}
} else {
$sortarr[$i] = $arg;
}
$msortline .= "\$sortarr[" . $i . "],";
}
$msortline .= "\$marray));";
if(is_array($marray) && count($marray) > 0) {
@ eval($msortline);
}
return $marray;
}
/**
* str_ireplace_once - Replaces a string only once
*
* Caution: This function only takes strings as parameters,
* not arrays!
* @param $find string String to find
* @param $replace string String to replace
* @param $subject string String to process
*
* @return string Processed string
*/
function str_ireplace_once($find, $replace, $subject) {
$start = strpos(strtolower($subject), strtolower($find));
if ($start === false) {
return $subject;
}
$end = $start + strlen($find);
$first = substr($subject, 0, $start);
$last = substr($subject, $end, strlen($subject) - $end);
$result = $first . $replace . $last;
return ($result);
}
/**
* str_ireplace_once_reverse - Replaces a string only once, in reverse direction
*
* Caution: This function only takes strings as parameters,
* not arrays!
* @param $find string String to find
* @param $replace string String to replace
* @param $subject string String to process
*
* @return string Processed string
*/
function str_ireplace_once_reverse($find, $replace, $subject) {
$start = str_rpos(strtolower($subject), strtolower($find));
if ($start === false) {
return $subject;
}
$end = $start + strlen($find);
$first = substr($subject, 0, $start);
$last = substr($subject, $end, strlen($subject) - $end);
$result = $first . $replace . $last;
return ($result);
}
/**
* str_rpos - Finds a string position in reverse direction
*
* NOTE: The original strrpos-Function of PHP4 only finds
* a single character as needle.
*
* @param $haystack string String to search in
* @param $needle string String to search for
* @param $start integer Offset
*
* @return string Processed string
*/
function str_rpos($haystack, $needle, $start = 0) {
$tempPos = strpos($haystack, $needle, $start);
if ($tempPos === false) {
if ($start == 0) {
//Needle not in string at all
return false;
} else {
//No more occurances found
return $start - strlen($needle);
}
} else {
//Find the next occurance
return str_rpos($haystack, $needle, $tempPos + strlen($needle));
}
}
/**
* isImageMagickAvailable - checks if ImageMagick is available
*
* @return boolean true if ImageMagick is available
*/
function isImageMagickAvailable() {
global $_imagemagickAvailable;
if (is_bool($_imagemagickAvailable)) {
if ($_imagemagickAvailable === true) {
return true;
} else {
return false;
}
}
$output = array();
$retval = 0;
@exec("convert", $output, $retval);
if (!is_array($output) || count($output) == 0) {
return false;
}
if (strpos($output[0], "ImageMagick") !== false) {
$_imagemagickAvailable = true;
return true;
} else {
$_imagemagickAvailable = false;
return false;
}
}
/**
* isRunningFromWeb - checks if the script is being runned from the web
*
* @return boolean true if the script is running from the web
*/
function isRunningFromWeb() {
if ($_SERVER["PHP_SELF"] == "" || php_sapi_name() == "cgi" || php_sapi_name() == "cli") {
return false;
}
return true;
}
/**
* getClientName: Returns the client name for a given ID
*
* @return string client name
*/
function getClientName($idclient) {
global $cfg;
$db = new DB_ConLite;
$sql = "SELECT name FROM " . $cfg["tab"]["clients"] . " WHERE idclient='" . Contenido_Security::toInteger($idclient) . "'";
$db->query($sql);
if ($db->next_record()) {
return $db->f("name");
} else {
return false;
}
}
function scanDirectory($sDirectory, $bRecursive = false) {
if (substr($sDirectory, strlen($sDirectory) - 1, 1) == "/") {
$sDirectory = substr($sDirectory, 0, strlen($sDirectory) - 1);
}
if (!is_dir($sDirectory)) {
return false;
}
$aFiles = array();
$hDirHandle = opendir($sDirectory);
while ($sFile = readdir($hDirHandle)) {
$sFullpathFile = $sDirectory . "/" . $sFile;
if (is_file($sFullpathFile) && is_readable($sFullpathFile)) {
$aFiles[] = $sFullpathFile;
}
if (is_dir($sFullpathFile) && $sFile != "." && $sFile != ".." && $bRecursive == true) {
$aSubFiles = scanDirectory($sFullpathFile, $bRecursive);
if (is_array($aSubFiles)) {
$aFiles = array_merge($aFiles, $aSubFiles);
}
}
}
return $aFiles;
}
/**
* scanPlugins: Scans a given plugin directory and places the
* found plugins into the array $cfg['plugins']
*
*
* Example:
* scanPlugins("frontendusers");
*
* Result:
* $cfg['plugins']['frontendusers'] => array with all found plugins
*
* Note: Plugins are only "found" if the following directory structure
* if found:
*
* entity/
* plugin1/plugin1.php
* plugin2/plugin2.php
*
* The plugin's directory and file name have to be the
* same, otherwise the function won't find them!
*
* @param $entity Name of the directory to scan
* @return string client name
*/
function scanPlugins($entity) {
global $cfg;
$pluginorder = getSystemProperty("plugin", $entity . "-pluginorder");
$lastscantime = getSystemProperty("plugin", $entity . "-lastscantime");
$plugins = array();
/* Fetch and trim the plugin order */
if ($pluginorder != "") {
$plugins = explode(",", $pluginorder);
foreach ($plugins as $key => $plugin) {
$plugins[$key] = trim($plugin);
}
}
$basedir = $cfg["path"]["contenido"] . $cfg["path"]["plugins"] . "$entity/";
/* Don't scan all the time, but each 60 seconds */
if ($lastscantime + 60 < time()) {
setSystemProperty("plugin", $entity . "-lastscantime", time());
$dh = opendir($basedir);
while (($file = readdir($dh)) !== false) {
if (is_dir($basedir . $file) && $file != "includes" && $file != "." && $file != "..") {
if (!in_array($file, $plugins)) {
if (file_exists($basedir . $file . "/" . $file . ".php")) {
$plugins[] = $file;
}
}
}
}
foreach ($plugins as $key => $value) {
if (!is_dir($basedir . $value) || !file_exists($basedir . $value . "/" . $value . ".php")) {
unset($plugins[$key]);
}
}
$pluginorder = implode(",", $plugins);
setSystemProperty("plugin", $entity . "-pluginorder", $pluginorder);
}
foreach ($plugins as $key => $value) {
if (!is_dir($basedir . $value) || !file_exists($basedir . $value . "/" . $value . ".php")) {
unset($plugins[$key]);
} else {
i18nRegisterDomain($entity . "_" . $value, $basedir . $value . "/locale/");
}
}
$cfg['plugins'][$entity] = $plugins;
}
/**
* includePlugins: Includes plugins for a given entity
*
* Example:
* includePlugins("frontendusers");
*
* @param $entity Name of the directory to scan
*/
function includePlugins($entity) {
global $cfg;
if (is_array($cfg['plugins'][$entity])) {
foreach ($cfg['plugins'][$entity] as $plugin) {
plugin_include($entity, $plugin . "/" . $plugin . ".php");
}
}
}
/**
* callPluginStore: Calls the plugin's store methods
*
* Example:
* callPluginStore("frontendusers");
*
* @param $entity Name of the directory to scan
*/
function callPluginStore($entity) {
global $cfg;
/* Check out if there are any plugins */
if (is_array($cfg['plugins'][$entity])) {
foreach ($cfg['plugins'][$entity] as $plugin) {
if (function_exists($entity . "_" . $plugin . "_wantedVariables") && function_exists($entity . "_" . $plugin . "_store")) {
$wantVariables = call_user_func($entity . "_" . $plugin . "_wantedVariables");
if (is_array($wantVariables)) {
$varArray = array();
foreach ($wantVariables as $value) {
$varArray[$value] = stripslashes($GLOBALS[$value]);
}
}
$store = call_user_func($entity . "_" . $plugin . "_store", $varArray);
}
}
}
}
function displayPlugin($entity, & $form) {
/* TODO: Function can't work, as $feuser is not defined (see $display =
* call_user_func($entity."_".$plugin."_display", $feuser);) and plugins need
* - if data has to be shown - global objects ...
*/
$pluginOrder = trim_array(explode(",", getSystemProperty("plugin", $entity . "-pluginorder")));
/* Check out if there are any plugins */
if (is_array($pluginOrder)) {
foreach ($pluginOrder as $plugin) {
if (function_exists($entity . "_" . $plugin . "_getTitle") && function_exists($entity . "_" . $plugin . "_display")) {
$plugTitle = call_user_func($entity . "_" . $plugin . "_getTitle");
$display = call_user_func($entity . "_" . $plugin . "_display", $feuser);
if (is_array($plugTitle) && is_array($display)) {
foreach ($plugTitle as $key => $value) {
$form->add($value, $display[$key]);
}
} else {
if (is_array($plugTitle) || is_array($display)) {
$form->add("WARNING", "The plugin $plugin delivered an array for the displayed titles, but did not return an array for the contents.");
} else {
$form->add($plugTitle, $display);
}
}
}
}
}
}
/**
* createRandomName: Creates a random name (example: Passwords)
*
* Example:
* echo createRandomName(8);
*
* @param $nameLength Length of the generated string
* @return string random name
*/
function createRandomName($nameLength) {
$NameChars = 'abcdefghijklmnopqrstuvwxyz';
$Vouel = 'aeiou';
$Name = "";
for ($index = 1; $index <= $nameLength; $index++) {
if ($index % 3 == 0) {
$randomNumber = rand(1, strlen($Vouel));
$Name .= substr($Vouel, $randomNumber - 1, 1);
} else {
$randomNumber = rand(1, strlen($NameChars));
$Name .= substr($NameChars, $randomNumber - 1, 1);
}
}
return $Name;
}
/**
* sendPostRequest: Sents a HTTP POST request
*
* Example:
* sendPostRequest("hostname", "serverpath/test.php", $data);
*
* @param $host Hostname or domain
* @param $pathhost Path on the host or domain
* @param $data Data to send
* @param $referer Referer (optional)
* @param $port Port (default: 80)
*/
function sendPostRequest($host, $path, $data, $referer = "", $port = 80) {
$fp = fsockopen($host, $port);
fputs($fp, "POST $path HTTP/1.1\n");
fputs($fp, "Host: $host\n");
fputs($fp, "Referer: $referer\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
fputs($fp, "Content-length: " . strlen($data) . "\n");
fputs($fp, "Connection: close\n\n");
fputs($fp, "$data\n");
while (!feof($fp)) {
$res .= fgets($fp, 128);
}
fclose($fp);
return $res;
}
function is_dbfs($file) {
if(is_null($file)) {
$file = '';
}
if (substr($file, 0, 5) == "dbfs:") {
return true;
}
}
function setHelpContext($area) {
global $cfg;
if ($cfg['help'] == true) {
$hc = "parent.parent.parent.frames[0].document.getElementById('help').setAttribute('data', '$area');";
} else {
$hc = "";
}
return $hc;
}
function define_if($constant, $value) {
if (!defined($constant)) {
define($constant, $value);
}
}
/**
* Specify platform specific newline character; PHP_EOL has been introduced in PHP 5.0.2
* Note, that Mac seems to use \r, sorry guys
*/
if (!defined('PHP_EOL')) {
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
define('PHP_EOL', "\r\n"); // Windows
} else {
define('PHP_EOL', "\n"); // *nix
}
}
function locale_arsort($locale, $array) {
$oldlocale = setlocale(LC_COLLATE, 0);
setlocale(LC_COLLATE, $locale);
uasort($array, "strcoll");
setlocale(LC_COLLATE, $oldlocale);
return ($array);
}
/* TODO: Ask timo to document this. */
/* Note: If subarrays exists, this function currently returns the key of the array
given by $array, and not from the subarrays (todo: add flag to allow this) */
function array_search_recursive($search, $array, $partial = false, $strict = false) {
foreach ($array as $key => $value) {
if (is_array($value)) {
$val = array_search_recursive($search, $value, $partial, $strict);
if ($val !== false) {
return ($key);
}
} else {
if ($partial == false) {
if ($strict == true) {
if ($value === $search) {
return $key;
}
} else {
if ($value == $search) {
return $key;
}
}
} else {
if (strpos($value, $search) !== FALSE) {
return $key;
}
}
}
}
return false;
}
/**
* cDie: Contenido die-alternative
*
* @author unknown
*
* @param string $file File name (use __FILE__)
* @param string $line Line number (use __LINE__)
* @param string $message Message to display
* @return void
*/
function cDie($file, $line, $message) {
cError($file, $line, $message);
die("$file $line: $message");
}
/**
* cWarning: Contenido warning
*
* @param $file File name (use __FILE__)
* @param $line Line number (use __LINE__)
* @param $message Message to display
*/
function cWarning($file, $line, $message) {
trigger_error("$file $line: $message", E_USER_WARNING);
}
/**
* cError: Contenido error
*
* @param $file File name (use __FILE__)
* @param $line Line number (use __LINE__)
* @param $message Message to display
*/
function cError($file, $line, $message) {
trigger_error("$file $line: $message", E_USER_ERROR);
}
/**
* cDeprecated: Trigger deprecated stuff
*
* @author Ortwin Pinke <o.pinke@conlite.org>
* @param string $file File name (use __FILE__)
* @param string $line Line number (use __LINE__)
* @param string $message Message to display
*/
function cDeprecated($file, $line, $message) {
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
trigger_error($file . " " . $line . ": " . $message, E_USER_DEPRECATED);
} else {
trigger_error("$file $line: $message", E_USER_WARNING);
}
}
/**
* getNamedFrame: Returns the name of the numeric frame given
*
* @param $frame Frame number
* @return string Canonical name of the frame
*/
function getNamedFrame($frame) {
switch ($frame) {
case 1 :
return ("left_top");
break;
case 2 :
return ("left_bottom");
break;
case 3 :
return ("right_top");
break;
case 4 :
return ("right_bottom");
break;
default :
return ("");
break;
}
}
/**
* startTiming: Starts the timing for a specific function
*
* @param function string Name of the function
* @param parameters array All parameters for the function to measure
*
* @return int uuid for this measure process
*/
function startTiming($function, $parameters = array()) {
global $_timings, $cfg;
if ($cfg["debug"]["functiontiming"] == false) {
return;
}
/* Create (almost) unique ID */
$uuid = md5(uniqid(rand(), true));
if (!is_array($parameters)) {
cWarning(__FILE__, __LINE__, "Warning: startTiming's parameters parameter expects an array");
$parameters = array();
}
$_timings[$uuid]["parameters"] = $parameters;
$_timings[$uuid]["function"] = $function;
$_timings[$uuid]["start"] = getmicrotime();
return $uuid;
}
/**
* endAndLogTiming: Ends the timing process and logs it to the timings file
*
* @param uuid int UUID which has been used for timing
*/
function endAndLogTiming($uuid) {
global $_timings, $cfg;
if ($cfg["debug"]["functiontiming"] == false) {
return;
}
$_timings[$uuid]["end"] = getmicrotime();
$timeSpent = $_timings[$uuid]["end"] - $_timings[$uuid]["start"];
$myparams = array();
/* Build nice representation of the function */
foreach ($_timings[$uuid]["parameters"] as $parameter) {
switch (gettype($parameter)) {
case "string" :
$myparams[] = '"' . $parameter . '"';
break;
case "boolean" :
if ($parameter == true) {
$myparams[] = "true";
} else {
$myparams[] = "false";
}
break;
default :
if ($parameter == "") {
$myparams[] = '"' . $parameter . '"';
} else {
$myparams[] = $parameter;
}
}
}
$parameterString = implode(", ", $myparams);
trigger_error("calling function " . $_timings[$uuid]["function"] . "(" . $parameterString . ") took " . $timeSpent . " seconds", E_USER_NOTICE);
}
// @TODO: it's better to create a instance of DB_ConLite class, the class constructor connects also to the database.
function checkMySQLConnectivity() {
global $contenido_host, $contenido_database, $contenido_user, $contenido_password, $cfg;
if ($cfg["database_extension"] == "mysqli") {
if (function_exists("mysqli_connect")) {
if (($iPos = strpos($contenido_host, ":")) !== false) {
list($sHost, $sPort) = explode(":", $contenido_host);
$res = mysqli_connect($sHost, $contenido_user, $contenido_password, "", $sPort);
} else {
$res = mysqli_connect($contenido_host, $contenido_user, $contenido_password);
}
} else {
$res = NULL;
}
} else {
if (function_exists("mysql_connect")) {
$res = mysql_connect($contenido_host, $contenido_user, $contenido_password);
} else {
$res = NULL;
}
}
$selectDb = false;
if ($res) {
if ($cfg["database_extension"] == "mysqli") {
$selectDb = mysqli_select_db($res, $contenido_database);
} else {
$selectDb = mysql_select_db($contenido_database, $res);
}
}
if (!$res || !$selectDb) {
$errortitle = i18n("MySQL Database not reachable for installation %s");
$errortitle = sprintf($errortitle, $cfg["path"]["contenido_fullhtml"]);
$errormessage = i18n("The MySQL Database for the installation %s is not reachable. Please check if this is a temporary problem or if it is a real fault.");
$errormessage = sprintf($errormessage, $cfg["path"]["contenido_fullhtml"]);
notifyOnError($errortitle, $errormessage);
if ($cfg["contenido"]["errorpage"] != "") {
header("Location: " . $cfg["contenido"]["errorpage"]);
} else {
die("Could not connect to the database server with this configuration!");
}
exit;
} else {
if ($cfg["database_extension"] == "mysqli") {
mysqli_close($res);
} else {
mysql_close($res);
}
}
}
function notifyOnError($errortitle, $errormessage) {
global $cfg;
$sFileNotify = $cfg['path']['conlite_logs'] . "notify.txt";
if (file_exists($sFileNotify)) {
$notifytimestamp = file_get_contents($sFileNotify);
} else {
$notifytimestamp = 0;
}
if ((time() - $notifytimestamp) > $cfg["contenido"]["notifyinterval"] * 60) {
if ($cfg['contenido']['notifyonerror'] != "") {
$sMailhost = getSystemProperty('system', 'mail_host');
if ($sMailhost == '') {
$sMailhost = 'localhost';
}
$oMail = new PHPMailer();
$oMail->Host = $sMailhost;
$oMail->IsHTML(0);
$oMail->WordWrap = 1000;
$oMail->IsMail();
$oMail->AddAddress($cfg["contenido"]["notifyonerror"], "");
$oMail->Subject = $errortitle;
$oMail->Body = $errormessage;
/* Notify configured email */
$oMail->Send();
}
/* Write last notify log file */
file_put_contents($sFileNotify, time());
}
}
function cIDNAEncode($sourceEncoding, $string) {
if (extension_loaded("iconv")) {
cInclude('pear', 'Net/IDNA.php');
$idn = Net_IDNA :: getInstance();
$string = iconv("UTF-8", $sourceEncoding, $string);
$string = $idn->encode($string);
return ($string);
}
if (extension_loaded("recode")) {
cInclude('pear', 'Net/IDNA.php');
$idn = Net_IDNA :: getInstance();
$string = $idn->decode($string);
$string = recode_string("UTF-8.." . $sourceEncoding, $string);
return $string;
}
return $string;
}
function cIDNADecode($targetEncoding, $string) {
if (extension_loaded("iconv")) {
cInclude('pear', 'Net/IDNA.php');
$idn = Net_IDNA :: getInstance();
$string = $idn->decode($string);
$string = iconv($targetEncoding, "UTF-8", $string);
return ($string);
}
if (extension_loaded("recode")) {
cInclude('pear', 'Net/IDNA.php');
$idn = Net_IDNA :: getInstance();
$string = recode_string($targetEncoding . "..UTF-8", $string);
$string = $idn->decode($string);
return $string;
}
return $string;
}
/**
* Checks for a named key of an array, pushes it if not set with a default value
*
* @param array $aArray reference of array
* @param string $sKey key to check for and to set
* @param multi $mDefault default value
* @return boolean false if no array is given, void otherwise
*/
function cInitializeArrayKey(&$aArray, $sKey, $mDefault = "") {
if (!is_array($aArray)) {
if (isset($aArray)) {
return false;
}
$aArray = array();
}
if (!array_key_exists($sKey, $aArray)) {
$aArray[$sKey] = $mDefault;
}
}
/**
* Function checks current language
* and client settings by HTTP-Params
* and DB settings. Based on this
* informations it will send an HTTP
* header for right encoding.
*
* @param DB_ConLite $db
* @param array $cfg global cfg-array
* @param int $lang global language id
*
* @since 4.6.18
*
* @version 1.0.0
* @author Holger Librenz
*/
function sendEncodingHeader($db, $cfg, $lang) {
if (array_key_exists("use_encoding", $_GET)) {
$use_encoding = trim(strip_tags($_GET["use_encoding"]));
}
if (array_key_exists("use_encoding", $_POST)) {
$use_encoding = trim(strip_tags($_POST["use_encoding"]));
}
if (!isset($use_encoding)) {
$use_encoding = true;
}
if (is_string($use_encoding)) {
if ($use_encoding == "false") {
$use_encoding = false;
} else {
$use_encoding = true;
}
}
if ($use_encoding != false) {
$sql = "SELECT idlang, encoding FROM " . $cfg["tab"]["lang"];
$db->query($sql);
$aLanguageEncodings = array();
while ($db->next_record()) {
$aLanguageEncodings[$db->f("idlang")] = $db->f("encoding");
}
if (array_key_exists($lang, $aLanguageEncodings)) {
if (!in_array($aLanguageEncodings[$lang], $cfg['AvailableCharsets'])) {
header("Content-Type: text/html; charset=ISO-8859-1");
} else {
header("Content-Type: text/html; charset={$aLanguageEncodings[$lang]}");
}
} else {
header("Content-Type: text/html; charset=ISO-8859-1");
}
}
}
/**
* IP_match
*
* @param string $network
* @param string $mask
* @param string $ip
* @return boolean
*/
function IP_match($network, $mask, $ip) {
bcscale(3);
$ip_long = ip2long($ip);
$mask_long = ip2long($network);
#
# Convert mask to divider
#
if (preg_match('/^[0-9]+$/', $mask)) {
/// 212.50.13.0/27 style mask (Cisco style)
$divider = bcpow(2, (32 - $mask));
} else {
/// 212.50.13.0/255.255.255.0 style mask
$xmask = ip2long($mask);
if ($xmask < 0)
$xmask = bcadd(bcpow(2, 32), $xmask);
$divider = bcsub(bcpow(2, 32), $xmask);
}
#
# Test is IP within specified mask
#
if (floor(bcdiv($ip_long, $divider)) == floor(bcdiv($mask_long, $divider))) {
# match - this IP is within specified mask
return true;
} else {
# fail - this IP is NOT within specified mask
return false;
}
}
?>