<?php /* Jappix - An open social platform These are the PHP functions for Jappix ------------------------------------------------- License: AGPL Authors: Vanaryon, LinkMauve, Mathieui, olivierm Last revision: 16/01/12 */ // The function to check if Jappix is already installed function isInstalled() { if(!file_exists(JAPPIX_BASE.'/store/conf/installed.xml')) return false; return true; } // The function to check if a static host is defined function hasStatic() { if(HOST_STATIC && (HOST_STATIC != '.')) return true; return false; } // The function to check if this is a static server function isStatic() { if(hasStatic() && (parse_url(HOST_STATIC, PHP_URL_HOST) == $_SERVER['HTTP_HOST'])) return true; return false; } // The function to check if this is an upload server function isUpload() { if(HOST_UPLOAD && (parse_url(HOST_UPLOAD, PHP_URL_HOST) == $_SERVER['HTTP_HOST'])) return true; return false; } // The function to get the users.xml file hashed name function usersConfName() { $conf_dir = JAPPIX_BASE.'/store/conf'; // No conf folder? if(!is_dir($conf_dir)) return ''; // Read the conf folder $conf_scan = scandir($conf_dir.'/'); $conf_name = ''; // Loop the XML files foreach($conf_scan as $current) { if(preg_match('/(.+)(\.users\.xml)($)/', $current)) { $conf_name = $current; break; } } // Return the users file name return $conf_name; } // The function to write a XML file function writeXML($type, $xmlns, $xml) { // Generate the file path $conf_path = JAPPIX_BASE.'/store/'.$type.'/'; $conf_name = $xmlns.'.xml'; // Secured stored file? if(($type == 'conf') && ($xmlns == 'users')) { // Get the secured file name $conf_secured = usersConfName(); // Does this file exist? if($conf_secured) $conf_name = $conf_secured; else $conf_name = hash('sha256', rand(1, 99999999).time()).'.users.xml'; } // Generate the file complete path $conf_file = $conf_path.$conf_name; // Write the installed marker $gen_xml = '<?xml version="1.0" encoding="utf-8" ?> <jappix xmlns="jappix:'.$type.':'.$xmlns.'"> '.trim($xml).' </jappix>'; file_put_contents($conf_file, $gen_xml); return true; } // The function to read a XML file function readXML($type, $xmlns) { // Generate the file path $conf_path = JAPPIX_BASE.'/store/'.$type.'/'; $conf_name = $xmlns.'.xml'; // Secured stored file? if(($type == 'conf') && ($xmlns == 'users')) { // Get the secured file name $conf_secured = usersConfName(); // Does this file exist? if($conf_secured) $conf_name = $conf_secured; } // Generate the file complete path $conf_file = $conf_path.$conf_name; if(file_exists($conf_file)) return file_get_contents($conf_file); return false; } // The function to read remote URLs function read_url($url) { // Any cURL? if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $data = curl_exec($ch); curl_close($ch); } // Default method else $data = @file_get_contents($url); return $data; } // The function to get the Jappix app. current version function getVersion() { $file = file_get_contents(JAPPIX_BASE.'/VERSION'); $version = trim($file); return $version; } // The function to detect the user's language function checkLanguage() { // If the user defined a language if(isset($_GET['l']) && !empty($_GET['l'])) { // We define some stuffs $defined_lang = strtolower($_GET['l']); $lang_file = JAPPIX_BASE.'/lang/'.$defined_lang.'/LC_MESSAGES/main.mo'; if($defined_lang == 'en') $lang_found = true; else $lang_found = file_exists($lang_file); // We check if the asked translation exists if($lang_found) { $lang = $defined_lang; // Write a cookie setcookie('jappix_locale', $lang, (time() + 31536000)); return $lang; } } // No language has been defined, but a cookie is stored if(isset($_COOKIE['jappix_locale'])) { $check_cookie = $_COOKIE['jappix_locale']; // The cookie has a value, check this value if($check_cookie && (file_exists(JAPPIX_BASE.'/lang/'.$check_cookie.'/LC_MESSAGES/main.mo') || ($check_cookie == 'en'))) return $check_cookie; } // No cookie defined (or an unsupported value), naturally, we check the browser language if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) return 'en'; // We get the language of the browser $nav_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $check_en = strtolower($nav_langs[0]); // We check if this is not english if($check_en == 'en') return 'en'; $order = array(); foreach($nav_langs as $entry) { $indice = explode('=', $entry); $lang = strtolower(substr(trim($indice[0]), 0, 2)); if(!isset($indice[1]) || !$indice[1]) $indice = 1; else $indice = $indice[1]; $order[$lang] = $indice; } arsort($order); foreach($order as $nav_lang => $val) { $lang_found = file_exists(JAPPIX_BASE.'/lang/'.$nav_lang.'/LC_MESSAGES/main.mo'); if($lang_found) return $nav_lang; } // If Jappix doen't know that language, we include the english translation return 'en'; } // The function to convert a ISO language code to its full name function getLanguageName($code) { $code = strtolower($code); $known = array( 'aa' => 'Afaraf', 'ab' => 'Аҧсуа', 'ae' => 'Avesta', 'af' => 'Afrikaans', 'ak' => 'Akan', 'am' => 'አማርኛ', 'an' => 'Aragonés', 'ar' => 'العربية', 'as' => 'অসমীয়া', 'av' => 'авар мацӀ', 'ay' => 'Aymar aru', 'az' => 'Azərbaycan dili', 'ba' => 'башҡорт теле', 'be' => 'Беларуская', 'bg' => 'български', 'bh' => 'भोजपुरी', 'bi' => 'Bislama', 'bm' => 'Bamanankan', 'bn' => 'বাংলা', 'bo' => 'བོད་ཡིག', 'br' => 'Brezhoneg', 'bs' => 'Bosanski jezik', 'ca' => 'Català', 'ce' => 'нохчийн мотт', 'ch' => 'Chamoru', 'co' => 'Corsu', 'cr' => 'ᓀᐦᐃᔭᐍᐏᐣ', 'cs' => 'Česky', 'cu' => 'Словѣньскъ', 'cv' => 'чӑваш чӗлхи', 'cy' => 'Cymraeg', 'da' => 'Dansk', 'de' => 'Deutsch', 'dv' => 'ދިވެހި', 'dz' => 'རྫོང་ཁ', 'ee' => 'Ɛʋɛgbɛ', 'el' => 'Ελληνικά', 'en' => 'English', 'eo' => 'Esperanto', 'es' => 'Español', 'et' => 'Eesti keel', 'eu' => 'Euskara', 'fa' => 'فارسی', 'ff' => 'Fulfulde', 'fi' => 'Suomen kieli', 'fj' => 'Vosa Vakaviti', 'fo' => 'Føroyskt', 'fr' => 'Français', 'fy' => 'Frysk', 'ga' => 'Gaeilge', 'gd' => 'Gàidhlig', 'gl' => 'Galego', 'gn' => 'Avañe\'ẽ', 'gu' => 'ગુજરાતી', 'gv' => 'Ghaelg', 'ha' => 'هَوُسَ', 'he' => 'עברית', 'hi' => 'हिन्दी', 'ho' => 'Hiri Motu', 'hr' => 'Hrvatski', 'ht' => 'Kreyòl ayisyen', 'hu' => 'Magyar', 'hy' => 'Հայերեն', 'hz' => 'Otjiherero', 'ia' => 'Interlingua', 'id' => 'Bahasa', 'ie' => 'Interlingue', 'ig' => 'Igbo', 'ii' => 'ꆇꉙ', 'ik' => 'Iñupiaq', 'io' => 'Ido', 'is' => 'Íslenska', 'it' => 'Italiano', 'iu' => 'ᐃᓄᒃᑎᑐᑦ', 'ja' => '日本語', 'jv' => 'Basa Jawa', 'ka' => 'ქართული', 'kg' => 'KiKongo', 'ki' => 'Gĩkũyũ', 'kj' => 'Kuanyama', 'kk' => 'Қазақ тілі', 'kl' => 'Kalaallisut', 'km' => 'ភាសាខ្មែរ', 'kn' => 'ಕನ್ನಡ', 'ko' => '한 국어', 'kr' => 'Kanuri', 'ks' => 'कश्मीरी', 'ku' => 'Kurdî', 'kv' => 'коми кыв', 'kw' => 'Kernewek', 'ky' => 'кыргыз тили', 'la' => 'Latine', 'lb' => 'Lëtzebuergesch', 'lg' => 'Luganda', 'li' => 'Limburgs', 'ln' => 'Lingála', 'lo' => 'ພາສາລາວ', 'lt' => 'Lietuvių kalba', 'lu' => 'cilubà', 'lv' => 'Latviešu valoda', 'mg' => 'Fiteny malagasy', 'mh' => 'Kajin M̧ajeļ', 'mi' => 'Te reo Māori', 'mk' => 'македонски јазик', 'ml' => 'മലയാളം', 'mn' => 'Монгол', 'mo' => 'лимба молдовеняскэ', 'mr' => 'मराठी', 'ms' => 'Bahasa Melayu', 'mt' => 'Malti', 'my' => 'ဗမာစာ', 'na' => 'Ekakairũ Naoero', 'nb' => 'Norsk bokmål', 'nd' => 'isiNdebele', 'ne' => 'नेपाली', 'ng' => 'Owambo', 'nl' => 'Nederlands', 'nn' => 'Norsk nynorsk', 'no' => 'Norsk', 'nr' => 'Ndébélé', 'nv' => 'Diné bizaad', 'ny' => 'ChiCheŵa', 'oc' => 'Occitan', 'oj' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'om' => 'Afaan Oromoo', 'or' => 'ଓଡ଼ିଆ', 'os' => 'Ирон æвзаг', 'pa' => 'ਪੰਜਾਬੀ', 'pi' => 'पािऴ', 'pl' => 'Polski', 'ps' => 'پښتو', 'pt' => 'Português', 'pt-br' => 'Brasileiro', 'qu' => 'Runa Simi', 'rm' => 'Rumantsch grischun', 'rn' => 'kiRundi', 'ro' => 'Română', 'ru' => 'Русский', 'rw' => 'Kinyarwanda', 'sa' => 'संस्कृतम्', 'sc' => 'sardu', 'sd' => 'सिन्धी', 'se' => 'Davvisámegiella', 'sg' => 'Yângâ tî sängö', 'sh' => 'Српскохрватски', 'si' => 'සිංහල', 'sk' => 'Slovenčina', 'sl' => 'Slovenščina', 'sm' => 'Gagana fa\'a Samoa', 'sn' => 'chiShona', 'so' => 'Soomaaliga', 'sq' => 'Shqip', 'sr' => 'српски језик', 'ss' => 'SiSwati', 'st' => 'seSotho', 'su' => 'Basa Sunda', 'sv' => 'Svenska', 'sw' => 'Kiswahili', 'ta' => 'தமிழ்', 'te' => 'తెలుగు', 'tg' => 'тоҷикӣ', 'th' => 'ไทย', 'ti' => 'ትግርኛ', 'tk' => 'Türkmen', 'tl' => 'Tagalog', 'tn' => 'seTswana', 'to' => 'faka Tonga', 'tr' => 'Türkçe', 'ts' => 'xiTsonga', 'tt' => 'татарча', 'tw' => 'Twi', 'ty' => 'Reo Mā`ohi', 'ug' => 'Uyƣurqə', 'uk' => 'українська', 'ur' => 'اردو', 'uz' => 'O\'zbek', 've' => 'tshiVenḓa', 'vi' => 'Tiếng Việt', 'vo' => 'Volapük', 'wa' => 'Walon', 'wo' => 'Wollof', 'xh' => 'isiXhosa', 'yi' => 'ייִדיש', 'yo' => 'Yorùbá', 'za' => 'Saɯ cueŋƅ', 'zh' => '中文', 'zu' => 'isiZulu' ); if(isset($known[$code])) return $known[$code]; return null; } // The function to know if a language is right-to-left function isRTL($code) { switch($code) { // RTL language case 'ar': case 'he': case 'dv': case 'ur': $is_rtl = true; break; // LTR language default: $is_rtl = false; break; } return $is_rtl; } // The function to set the good localized <html /> tag function htmlTag($locale) { // Initialize the tag $html = '<html xml:lang="'.$locale.'" lang="'.$locale.'" dir="'; // Set the good text direction (TODO) /* if(isRTL($locale)) $html .= 'rtl'; else $html .= 'ltr'; */ $html .= 'ltr'; // Close the tag $html .= '">'; echo($html); } // The function which generates the available locales list function availableLocales($active_locale) { // Initialize $scan = scandir(JAPPIX_BASE.'/lang/'); $list = array(); // Loop the available languages foreach($scan as $current_id) { // Get the current language name $current_name = getLanguageName($current_id); // Not valid? if(($current_id == $active_locale) || ($current_name == null)) continue; // Add this to the list $list[$current_id] = $current_name; } return $list; } // The function which generates the language switcher hidden part function languageSwitcher($active_locale) { // Initialize $keep_get = keepGet('l', false); $list = availableLocales($active_locale); $html = ''; // Generate the HTML code foreach($list as $current_id => $current_name) $html .= '<a href="./?l='.$current_id.$keep_get.'">'.htmlspecialchars($current_name).'</a>, '; // Output the HTML code return $html; } // The function to generate a strong hash function genStrongHash($string) { // Initialize $i = 0; // Loop to generate a incredibly strong hash (can be a bit slow) while($i < 10) { $string = hash('sha256', $string); $i++; } return $string; } // The function to generate the version hash function genHash($version) { // Get the configuration files path $conf_path = JAPPIX_BASE.'/store/conf/'; $conf_main = $conf_path.'main.xml'; $conf_hosts = $conf_path.'hosts.xml'; $conf_background = $conf_path.'background.xml'; $logos_dir = JAPPIX_BASE.'/store/logos/'; // Get the hash of the main configuration file if(file_exists($conf_main)) $hash_main = md5_file($conf_main); else $hash_main = '0'; // Get the hash of the main configuration file if(file_exists($conf_hosts)) $hash_hosts = md5_file($conf_hosts); else $hash_hosts = '0'; // Get the hash of the background configuration file if(file_exists($conf_background)) $hash_background = md5_file($conf_background); else $hash_background = '0'; // Get the hash of the logos folder $hash_logos = ''; if(is_dir($logos_dir)) { $logos_scan = scandir($logos_dir.'/'); foreach($logos_scan as $logos_current) { if(getFileExt($logos_current) == 'png') $hash_logos .= md5_file($logos_dir.$logos_current); } } return md5($version.$hash_main.$hash_hosts.$hash_background.$hash_logos); } // The function to hide the error messages function hideErrors() { // Hide errors if not developer if(!isDeveloper()) { ini_set('display_errors', 'off'); ini_set('error_reporting', 0); } // Developers need to get error reports! else { ini_set('display_errors', 'on'); ini_set('error_reporting', E_ALL); } } // The function to check BOSH proxy is enabled function BOSHProxy() { if(BOSH_PROXY == 'on') return true; return false; } // The function to check compression is enabled function hasCompression() { if(COMPRESSION != 'off') return true; return false; } // The function to check compression is available with the current client function canCompress() { // Compression allowed by admin & browser? if(hasCompression() && (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'))) return true; return false; } // The function to check whether to show manager link or not function showManagerLink() { if(MANAGER_LINK != 'off') return true; return false; } // The function to check HTTPS storage is allowed function httpsStorage() { if(HTTPS_STORAGE == 'on') return true; return false; } // The function to check HTTPS storage must be forced function httpsForce() { if((HTTPS_FORCE == 'on') && sslCheck()) return true; return false; } // The function to check we use HTTPS function useHttps() { if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) return true; return false; } // The function to compress the output pages function compressThis() { if(canCompress() && !isDeveloper()) ob_start('ob_gzhandler'); } // The function to choose one file get with get.php or a liste of resources function multiFiles() { if(MULTI_FILES == 'on') return true; return false; } function getFiles($h, $l, $t, $g, $f) { // Define the good path to the Get API if(hasStatic()) $path_to = HOST_STATIC.'/'; else $path_to = JAPPIX_BASE.'/'; if(!multiFiles()) { $values = array(); if ($h) $values[] = 'h='.$h; if ($l) $values[] = 'l='.$l; if ($t) $values[] = 't='.$t; if ($g) $values[] = 'g='.$g; if ($f) $values[] = 'f='.$f; return $path_to.'php/get.php?'.implode('&', $values); } if($g && !empty($g) && preg_match('/^(\S+)\.xml$/', $g) && preg_match('/^(css|js)$/', $t) && isSafe($g) && file_exists('xml/'.$g)) { $xml_data = file_get_contents('xml/'.$g); // Any data? if($xml_data) { $xml_read = new SimpleXMLElement($xml_data); $xml_parse = $xml_read->$t; // Files were added to the list before (with file var)? if($f) $f .= '~'.$xml_parse; else $f = $xml_parse; } } // Explode the f string if(strpos($f, '~') != false) $array = explode('~', $f); else $array = array($f); $a = array(); foreach($array as $file) $a[] = $path_to.$t.'/'.$file; if (count($a) == 1) return $a[0]; return $a; } function echoGetFiles($h, $l, $t, $g, $f) { if ($t == 'css') $pattern = '<link rel="stylesheet" href="%s" type="text/css" media="all" />'; else if ($t == 'js') $pattern = '<script type="text/javascript" src="%s"></script>'; $files = getFiles($h, $l, $t, $g, $f); if (is_string($files)) printf($pattern, $files); else { $c = count($files)-1; for($i=0; $i<=$c; $i++) { if ($i) echo ' '; printf($pattern, $files[$i]); if ($i != $c) echo "\n"; } } } // The function to check if anonymous mode is authorized function anonymousMode() { if(isset($_GET['r']) && !empty($_GET['r']) && HOST_ANONYMOUS && (ANONYMOUS == 'on')) return true; else return false; } // The function to quickly translate a string function _e($string) { echo T_gettext($string); } // The function to check the encrypted mode function sslCheck() { if(ENCRYPTION == 'on') return true; else return false; } // The function to return the encrypted link function sslLink() { // Using HTTPS? if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) $link = '<a class="home-images unencrypted" href="http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'">'.T_('Unencrypted').'</a>'; // Using HTTP? else $link = '<a class="home-images encrypted" href="https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'">'.T_('Encrypted').'</a>'; return $link; } // The function to get the Jappix static URL function staticURL() { // Check for HTTPS $protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; // Full URL $url = $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; return $url; } // The function to get the Jappix location (only from Get API!) function staticLocation() { // Filter the URL return preg_replace('/((.+)\/)php\/get\.php(\S)+$/', '$1', staticURL()); } // The function to include a translation file function includeTranslation($locale, $domain) { T_setlocale(LC_MESSAGES, $locale); T_bindtextdomain($domain, JAPPIX_BASE.'/lang'); T_bind_textdomain_codeset($domain, 'UTF-8'); T_textdomain($domain); } // The function to check the cache presence function hasCache($hash) { if(file_exists(JAPPIX_BASE.'/store/cache/'.$hash.'.cache')) return true; else return false; } // The function to check if developer mode is enabled function isDeveloper() { if(DEVELOPER == 'on') return true; else return false; } // The function to get a file extension function getFileExt($name) { return strtolower(preg_replace('/^(.+)(\.)([^\.]+)$/i', '$3', $name)); } // The function to get a file type function getFileType($ext) { switch($ext) { // Images case 'jpg': case 'jpeg': case 'png': case 'bmp': case 'gif': case 'tif': case 'svg': case 'psp': case 'xcf': $file_type = 'image'; break; // Videos case 'ogv': case 'mkv': case 'avi': case 'mov': case 'mp4': case 'm4v': case 'wmv': case 'asf': case 'mpg': case 'mpeg': case 'ogm': case 'rmvb': case 'rmv': case 'qt': case 'flv': case 'ram': case '3gp': case 'avc': $file_type = 'video'; break; // Sounds case 'oga': case 'ogg': case 'mka': case 'flac': case 'mp3': case 'wav': case 'm4a': case 'wma': case 'rmab': case 'rma': case 'bwf': case 'aiff': case 'caf': case 'cda': case 'atrac': case 'vqf': case 'au': case 'aac': case 'm3u': case 'mid': case 'mp2': case 'snd': case 'voc': $file_type = 'audio'; break; // Documents case 'pdf': case 'odt': case 'ott': case 'sxw': case 'stw': case 'ots': case 'sxc': case 'stc': case 'sxi': case 'sti': case 'pot': case 'odp': case 'ods': case 'doc': case 'docx': case 'docm': case 'xls': case 'xlsx': case 'xlsm': case 'xlt': case 'ppt': case 'pptx': case 'pptm': case 'pps': case 'odg': case 'otp': case 'sxd': case 'std': case 'std': case 'rtf': case 'txt': case 'htm': case 'html': case 'shtml': case 'dhtml': case 'mshtml': $file_type = 'document'; break; // Packages case 'tgz': case 'gz': case 'tar': case 'ar': case 'cbz': case 'jar': case 'tar.7z': case 'tar.bz2': case 'tar.gz': case 'tar.lzma': case 'tar.xz': case 'zip': case 'xz': case 'rar': case 'bz': case 'deb': case 'rpm': case '7z': case 'ace': case 'cab': case 'arj': case 'msi': $file_type = 'package'; break; // Others default: $file_type = 'other'; break; } return $file_type; } // The function to get the MIME type of a file function getFileMIME($path) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $cmime = finfo_file($finfo, $path); finfo_close($finfo); return $cmime; } // The function to keep the current GET vars function keepGet($current, $no_get) { // Get the HTTP GET vars $request = $_SERVER['REQUEST_URI']; if(strrpos($request, '?') === false) $get = ''; else { $uri = explode('?', $request); $get = $uri[1]; } // Remove the items we don't want here $proper = str_replace('&', '&', $get); $proper = preg_replace('/((^)|(&))(('.$current.'=)([^&]+))/i', '', $proper); // Nothing at the end? if(!$proper) return ''; // We have no defined GET var if($no_get) { // Remove the first "&" if it appears if(preg_match('/^(&(amp;)?)/i', $proper)) $proper = preg_replace('/^(&(amp;)?)/i', '', $proper); // Add the first "?" $proper = '?'.$proper; } // Add a first "&" if there is no one and no defined GET var else if(!$no_get && (substr($proper, 0, 1) != '&') && (substr($proper, 0, 5) != '&')) $proper = '&'.$proper; return $proper; } // Escapes regex special characters for in-regex usage function escapeRegex($string) { return preg_replace('/[-[\]{}()*+?.,\\^$|#]/', '\\$&', $string); } // Generates the security HTML code function securityHTML() { return '<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Jappix - Forbidden</title> </head> <body> <h1>Forbidden</h1> <h4>This is a private folder</h4> </body> </html>'; } // Checks if a relative server path is safe function isSafe($path) { // Mhh, someone is about to nasty stuffs (previous folder, or executable scripts) if(preg_match('/\.\.\//', $path) || preg_match('/index\.html?$/', $path) || preg_match('/(\.)((php([0-9]+)?)|(aspx?)|(cgi)|(rb)|(py)|(pl)|(jsp)|(ssjs)|(lasso)|(dna)|(tpl)|(smx)|(cfm))$/i', $path)) return false; return true; } // Set the good unity for a size in bytes function formatBytes($bytes, $precision = 2) { $units = array('B', 'KB', 'MB', 'GB', 'TB'); $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= pow(1024, $pow); return round($bytes, $precision) . ' ' . $units[$pow]; } // Converts a human-readable bytes value to a computer one function humanToBytes($string) { // Values array $values = array( 'K' => '000', 'M' => '000000', 'G' => '000000000', 'T' => '000000000000', 'P' => '000000000000000', 'E' => '000000000000000000', 'Z' => '000000000000000000000', 'Y' => '000000000000000000000000' ); // Filter the string foreach($values as $key => $zero) $string = str_replace($key, $zero, $string); // Converts the string into an integer $string = intval($string); return $string; } // Get the maximum file upload size function uploadMaxSize() { // Not allowed to upload files? if(ini_get('file_uploads') != 1) return 0; // Upload maximum file size $upload = humanToBytes(ini_get('upload_max_filesize')); // POST maximum size $post = humanToBytes(ini_get('post_max_size')); // Return the lowest value if($upload <= $post) return $upload; return $post; } // Normalizes special chars function normalizeChars($string) { $table = array( 'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r' ); return strtr($string, $table); } // Filters the XML special chars for the SVG drawer function filterSpecialXML($string) { // Strange thing: when $string = 'Mises à jour' -> bug! but 'Mise à jour' -> ok! $string = normalizeChars($string); // Encodes with HTML special chars $string = htmlspecialchars($string); return $string; } // Writes the current visit in the total file function writeTotalVisit() { // Get the current time stamp $stamp = time(); // Initialize the defaults $array = array( 'total' => 0, 'stamp' => $stamp ); // Try to read the saved data $total_data = readXML('access', 'total'); // Get the XML file values if($total_data) { // Initialize the visits reading $read_xml = new SimpleXMLElement($total_data); // Loop the visit elements foreach($read_xml->children() as $current_child) $array[$current_child->getName()] = intval($current_child); } // Increment the total number of visits $array['total']++; // Generate the new XML data $total_xml = '<total>'.$array['total'].'</total> <stamp>'.$array['stamp'].'</stamp>' ; // Re-write the new values writeXML('access', 'total', $total_xml); } // Writes the current visit in the months file function writeMonthsVisit() { // Get the current month $month = intval(date('m')); // Define the stats array $array = array(); // January to August period if($month <= 8) { for($i = 1; $i <= 8; $i++) $array['month_'.$i] = 0; } // August to September period else { $i = 8; $j = 1; while($j <= 3) { // Last year months if(($i >= 8) && ($i <= 12)) $array['month_'.$i++] = 0; // First year months else $array['month_'.$j++] = 0; } } // Try to read the saved data $months_data = readXML('access', 'months'); // Get the XML file values if($months_data) { // Initialize the visits reading $read_xml = new SimpleXMLElement($months_data); // Loop the visit elements foreach($read_xml->children() as $current_child) { $current_month = $current_child->getName(); // Parse the current month id $current_id = intval(preg_replace('/month_([0-9]+)/i', '$1', $current_month)); // Is this month still valid? if((($month <= 8) && ($current_id <= $month)) || (($month >= 8) && ($current_id >= 8) && ($current_id <= $month))) $array[$current_month] = intval($current_child); } } // Increment the current month value $array['month_'.$month]++; // Generate the new XML data $months_xml = ''; foreach($array as $array_key => $array_value) $months_xml .= "\n".' <'.$array_key.'>'.$array_value.'</'.$array_key.'>'; // Re-write the new values writeXML('access', 'months', $months_xml); } // Writes the current visit to the storage file function writeVisit() { // Write total visits writeTotalVisit(); // Write months visits writeMonthsVisit(); } // Returns the default background array function defaultBackground() { // Define the default values $background_default = array( 'type' => 'default', 'image_file' => '', 'image_repeat' => 'repeat-x', 'image_horizontal' => 'center', 'image_vertical' => 'top', 'image_adapt' => 'off', 'image_color' => '#cae1e9', 'color_color' => '#cae1e9' ); return $background_default; } // Reads the notice configuration function readNotice() { // Read the notice configuration XML $notice_data = readXML('conf', 'notice'); // Define the default values $notice_default = array( 'type' => 'none', 'notice' => '' ); // Stored data array $notice_conf = array(); // Read the stored values if($notice_data) { // Initialize the notice configuration XML data $notice_xml = new SimpleXMLElement($notice_data); // Loop the notice configuration elements foreach($notice_xml->children() as $notice_child) $notice_conf[$notice_child->getName()] = utf8_decode($notice_child); } // Checks no value is missing in the stored configuration foreach($notice_default as $notice_name => $notice_value) { if(!isset($notice_conf[$notice_name]) || empty($notice_conf[$notice_name])) $notice_conf[$notice_name] = $notice_default[$notice_name]; } return $notice_conf; } // The function to get the admin users function getUsers() { // Try to read the XML file $data = readXML('conf', 'users'); $array = array(); // Any data? if($data) { $read = new SimpleXMLElement($data); // Check the submitted user exists foreach($read->children() as $child) { // Get the node attributes $attributes = $child->attributes(); // Push the attributes to the global array (converted into strings) $array[$attributes['name'].''] = $attributes['password'].''; } } return $array; } // Manages users function manageUsers($action, $array) { // Try to read the old XML file $users_array = getUsers(); // What must we do? switch($action) { // Add some users case 'add': foreach($array as $array_user => $array_password) $users_array[$array_user] = genStrongHash($array_password); break; // Remove some users case 'remove': foreach($array as $array_user) { // Not the last user? if(count($users_array) > 1) unset($users_array[$array_user]); } break; } // Regenerate the XML $users_xml = ''; foreach($users_array as $users_name => $users_password) $users_xml .= "\n".' <user name="'.stripslashes(htmlspecialchars($users_name)).'" password="'.stripslashes($users_password).'" />'; // Write the main configuration writeXML('conf', 'users', $users_xml); } // Resize an image with GD function resizeImage($path, $ext, $width, $height) { // No GD? if(!function_exists('gd_info')) return false; try { // Initialize GD switch($ext) { case 'png': $img_resize = imagecreatefrompng($path); break; case 'gif': $img_resize = imagecreatefromgif($path); break; default: $img_resize = imagecreatefromjpeg($path); } // Get the image size $img_size = getimagesize($path); $img_width = $img_size[0]; $img_height = $img_size[1]; // Necessary to change the image width if($img_width > $width && ($img_width > $img_height)) { // Process the new sizes $new_width = $width; $img_process = (($new_width * 100) / $img_width); $new_height = (($img_height * $img_process) / 100); } // Necessary to change the image height else if($img_height > $height && ($img_width < $img_height)) { // Process the new sizes $new_height = $height; $img_process = (($new_height * 100) / $img_height); $new_width = (($img_width * $img_process) / 100); } // Else, just use the old sizes else { $new_width = $img_width; $new_height = $img_height; } // Create the new image $new_img = imagecreatetruecolor($new_width, $new_height); // Must keep alpha pixels? if(($ext == 'png') || ($ext == 'gif')){ imagealphablending($new_img, false); imagesavealpha($new_img, true); // Set transparent pixels $transparent = imagecolorallocatealpha($new_img, 255, 255, 255, 127); imagefilledrectangle($new_img, 0, 0, $new_width, $new_height, $transparent); } // Copy the new image imagecopyresampled($new_img, $img_resize, 0, 0, 0, 0, $new_width, $new_height, $img_size[0], $img_size[1]); // Destroy the old data imagedestroy($img_resize); unlink($path); // Write the new image switch($ext) { case 'png': imagepng($new_img, $path); break; case 'gif': imagegif($new_img, $path); break; default: imagejpeg($new_img, $path, 85); } return true; } catch(Exception $e) { return false; } } ?>