* @version $Id$ * @license http://opensource.org/licenses/gpl-2.0.php GNU GPL 2 */ /** * Gestion des affichages sur le forum (erreur, confirmation, etc.) * */ class Display extends Fsb_model { /** * Fonction de callback appelle par trigger_error() * * @param int $errno Code d'erreur * @param string $errstr Contenu de l'erreur * @param string $errfile Fichier d'erreur * @param int $errline Ligne d'erreur */ public static function error_handler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { return ; } switch ($errno) { case E_NOTICE : echo 'FSB Notice : ' . $errstr . ' in file ' . $errfile . ' (' . $errline . ')
'; break; case E_WARNING : echo 'FSB Warning : ' . $errstr . ' in file ' . $errfile . ' (' . $errline . ')
'; break; case FSB_ERROR : // Affichage de l'erreur fatale echo "FSB2 :: Erreur Une erreur a ete rencontree durant l'execution du script."; // Debugage possible ? if (Fsb::$debug->can_debug) { // Affichage plus precis de certaines erreurs if (preg_match('#^error_sql #i', $errstr) || preg_match('#^Call to undefined method #i', $errstr)) { $sql_backtrace = debug_backtrace(); if (isset($sql_backtrace[3])) { $index = 3; if (!isset($sql_backtrace[3]['line']) && isset($sql_backtrace[4])) { $index = 4; } $errline = $sql_backtrace[$index]['line']; $errfile = $sql_backtrace[$index]['file']; } unset($sql_backtrace); } echo " L'erreur rencontree est :
" . $errstr . "
a la ligne $errline du fichier $errfile"; $fsb_path = (Fsb::$cfg) ? Fsb::$cfg->get('fsb_path') : './'; if (file_exists(ROOT . fsb_basename($errfile, $fsb_path))) { echo "

Voici la zone ou se situe l'erreur dans le script :"; $content = file(ROOT . fsb_basename($errfile, Fsb::$cfg->get('fsb_path'))); $count_content = count($content); $begin = ($errline < 7) ? 0 : $errline - 7; echo '
';
						for ($i = $begin; $i < $count_content && $i <= ($begin + 14); $i++)
						{
							echo 'Ligne ' . $i . ' : ' . htmlspecialchars($content[$i]);
						}
						echo '
'; } // Debugage avance via un trace des fonctions / methodes appelees echo '
Trace des fonctions / methodes appelees :
';
					$back = debug_backtrace();
					$count_back = count($back);
					for ($i = ($count_back - 1); $i > 0; $i--)
					{
						echo  ((isset($back[$i]['class'])) ? "Methode :\t" . $back[$i]['class'] . $back[$i]['type'] : "Fonction :\t") . $back[$i]['function'] . "()\n";
						echo (isset($back[$i]['file'])) ? "Fichier :\t" . fsb_basename($back[$i]['file'], $fsb_path) . "\n" : '';
						echo (isset($back[$i]['line'])) ? "Ligne :\t\t" . $back[$i]['line'] : '';
						if ($i > 1)
						{
							echo "\n\n\n";
						}
					}
					echo '
'; } else { echo "

Le mode DEBUG est desactive, veuillez contacter l'administrateur du forum.
DEBUG mode is disactivated, please contact the forum's administrator.
"; } echo ''; if (defined('FSB_INSTALL')) { //Si il s'agit d'une erreur SQL, on log différement car ça peut etre long if(preg_match('#^error_sql #i', $errstr)) { Log::add_custom(Log::ERROR, 'Erreur SQL', array($errstr), $errline, $errfile); } else { Log::add_custom(Log::ERROR, $errstr, array(), $errline, $errfile); } } exit; break; case FSB_MESSAGE : // Message d'information Fsb::$tpl->set_file('error_handler.html'); Fsb::$tpl->set_vars(array( 'HANDLER_USE_FOOTER' => true, 'CONTENT' => (Fsb::$session->lang($errstr)) ? Fsb::$session->lang($errstr) : $errstr, )); $GLOBALS['_show_page_header_nav'] = true; $GLOBALS['_show_page_footer_nav'] = false; $GLOBALS['_show_page_stats'] = false; if (Fsb::$frame) { if (defined('FORUM')) { Fsb::$frame->frame_header(); } Fsb::$frame->frame_footer(); } exit; break; } } /** * Affiche un message d'information, suivit potentiellement d'un message de redirection. * * @param string $message Message a afficher */ public static function message($message) { $str = $message; $str_add = ''; if (func_num_args() > 1) { $url = func_get_arg(1); $str_add = ''; // Redirection apres le message d'erreur ? if (Fsb::$session->data['u_activate_redirection'] & 4) { Http::redirect(str_replace('&', '&', $url), 0); } else if (Fsb::$session->data['u_activate_redirection'] & 8) { Http::redirect($url, 3); $str_add = '

' . sprintf(Fsb::$session->lang('you_will_be_redirected'), 3); } } if (!defined('FSB_INSTALL')) { trigger_error($str, FSB_ERROR); } $content = ''; for ($i = 1; $i < func_num_args(); $i += 2) { $arg1 = func_get_arg($i); $arg2 = func_get_arg($i + 1); $content .= return_to($arg1, $arg2); } // Affichage du message d'erreur trigger_error(((Fsb::$session->lang($str)) ? Fsb::$session->lang($str) : $str) . $content . $str_add, FSB_MESSAGE); } /** * Affiche une boite de confirmation oui / non * * @param string $str Question de confirmation * @param string $url URL de redirection de la confirmation * @param array $hidden Tableau de champs HIDDEN a passer au formulaire */ public static function confirmation($str, $url, $hidden = array()) { Fsb::$tpl->set_file('confirmation.html'); Fsb::$tpl->set_vars(array( 'STR_CONFIRM' => $str, 'U_ACTION' => sid($url), )); // On ajoute dans le champs hidden une variable fsb_check_sid, qui contiendra la SID du membre // appelant cette page de confirmation. La reussite de la confirmation doit ensuite se faire // avec la fonction check_confirm(), qui verifiera si la SID est bonne. Le but etant de proteger // la confirmation en evitant a des scripts malicieux de forcer l'administrateur a confirmer // des actions automatiquements. $hidden['fsb_check_sid'] = Fsb::$session->sid; // On cree le code HTML des champs hidden foreach ($hidden AS $name => $value) { if (is_array($value)) { foreach ($value AS $subvalue) { Fsb::$tpl->set_blocks('hidden', array( 'NAME' => $name . '[]', 'VALUE' => $subvalue, )); } } else { Fsb::$tpl->set_blocks('hidden', array( 'NAME' => $name, 'VALUE' => $value, )); } } if (Fsb::$frame && (defined('FORUM') || defined('IN_ADM'))) { Fsb::$frame->frame_footer(); } exit; } /** * Affiche un formulaire pour entrer les identifiants FTP * * @return array Informations entrees pour la connexion FTP */ public static function check_ftp() { // Si on a entre les identifiants dans la configuration if (Fsb::$cfg->get('ftp_default')) { return (array( 'host' => Fsb::$cfg->get('ftp_host'), 'login' => Fsb::$cfg->get('ftp_login'), 'password' => Fsb::$cfg->get('ftp_password'), 'port' => Fsb::$cfg->get('ftp_port'), 'path' => Fsb::$cfg->get('ftp_path'), )); } // Si les identifiants ont ete envoyes on les retourne if (Http::request('ftp_submit', 'post')) { $password = trim(Http::request('ftp_password', 'post')); $data = array( 'host' => trim(Http::request('ftp_host', 'post')), 'login' => trim(Http::request('ftp_login', 'post')), 'path' => trim(Http::request('ftp_path', 'post')), 'port' => intval(Http::request('ftp_port', 'post')), ); // Si la case ftp_remind a ete cochee on garde l'hote, le login et le port en memoire. Pour des raisons de // securite on ne gardera pas le mot de passe en memoire if (Http::request('ftp_remind', 'post')) { Http::cookie('ftp', serialize($data), CURRENT_TIME + ONE_YEAR); } else { Http::cookie('ftp', '', CURRENT_TIME); } $data['password'] = $password; return ($data); } // Sinon on affiche le formulaire Fsb::$tpl->set_file('handler_ftp.html'); // On met les anciennes valeurs de POST en champs hidden foreach ($_POST AS $key => $value) { if (is_array($value)) { foreach ($value AS $subkey => $subvalue) { Fsb::$tpl->set_blocks('ftp_hidden', array( 'NAME' => $key . '[' . $subkey . ']', 'VALUE' => htmlspecialchars($subvalue), )); } } else { Fsb::$tpl->set_blocks('ftp_hidden', array( 'NAME' => $key, 'VALUE' => htmlspecialchars($value), )); } } $ftp_host = $ftp_login = ''; $ftp_port = '21'; $ftp_path = dirname($_SERVER['SCRIPT_NAME']); if (defined('IN_ADM')) { // Dans l'administration on supprime le repertoire admin/ $ftp_path = dirname($ftp_path); } // Valeur gardees en memoires dans un cookie ? if ($cookie = Http::getcookie('ftp')) { $cookie = unserialize($cookie); if (is_array($cookie)) { $ftp_host = $cookie['host']; $ftp_login = $cookie['login']; $ftp_port = $cookie['port']; $ftp_path = $cookie['path']; } } // Variables normales Fsb::$tpl->set_vars(array( 'FTP_HOST' => $ftp_host, 'FTP_LOGIN' => $ftp_login, 'FTP_PORT' => $ftp_port, 'FTP_PATH' => $ftp_path, 'FTP_REMIND' => (is_array($cookie)) ? true : false, 'U_ACTION' => sid(((defined('FORUM')) ? ROOT : '') . 'index.' . PHPEXT . '?' . htmlspecialchars($_SERVER['QUERY_STRING'])), )); Fsb::$frame->frame_footer(); exit; } /** * Genere l'affichage des FSBcodes * * @param bool $in_sig true si on est dans l'edition de signature * @param string $where Clause WHERE alternative */ public static function fsbcode($in_sig = false, $where = null) { if (is_null($where)) { $where = 'WHERE fsbcode_activated' . (($in_sig) ? '_sig' : '') . ' = 1 AND fsbcode_menu = 1'; } $sql = 'SELECT fsbcode_tag, fsbcode_img, fsbcode_description, fsbcode_list FROM ' . SQL_PREFIX . 'fsbcode ' . $where . ' ORDER BY fsbcode_order'; $result = Fsb::$db->query($sql, 'fsbcode_'); while ($row = Fsb::$db->row($result)) { $list = trim($row['fsbcode_list']); $code = $row['fsbcode_tag']; // Si on empeche les colorateurs de syntaxe d'etre utilises, la liste CODE n'a plus // aucune sens donc on le converti en fsbcode normal if ($code == 'code' && !Fsb::$mods->is_active('highlight_code')) { $list = ''; } // Upload activee ? if ($code == 'attach' && (!Fsb::$session->is_authorized('upload_file') || !Fsb::$mods->is_active('upload'))) { continue ; } // Simple Fsbcode ... if (!$list) { Fsb::$tpl->set_blocks('fsbcode', array( 'CODE' => $code, 'IMG' => ($row['fsbcode_img']) ? ROOT . 'tpl/' . Fsb::$session->data['u_tpl'] . '/img/fsbcode/' . $row['fsbcode_img'] : '', 'TEXT' => ($row['fsbcode_description']) ? htmlspecialchars($row['fsbcode_description']) : Fsb::$session->lang('fsbcode_' . $code), )); } // ... ou liste ? else { Fsb::$tpl->set_blocks('fsbcode_list', array( 'CODE' => $code, 'TEXT' => ($row['fsbcode_description']) ? htmlspecialchars($row['fsbcode_description']) : Fsb::$session->lang('fsbcode_text_' . $code), )); Fsb::$tpl->set_blocks('fsbcode_list.item', array( 'VALUE' => 0, 'LANG' => (Fsb::$session->lang('fsbcode_' . $code)) ? Fsb::$session->lang('fsbcode_' . $code) : $code, )); $style = null; foreach (explode("\n", $list) AS $i => $line) { $line = trim($line); if ($i == 0 && preg_match('#^style=(.*?)$#i', $line, $m)) { $style = $m[1]; } else { Fsb::$tpl->set_blocks('fsbcode_list.item', array( 'VALUE' => $line, 'STYLE' => ($style) ? sprintf('style="%s"', sprintf($style, $line)) : '', 'LANG' => (Fsb::$session->lang('fsbcode_item_' . $code . '_' . $line)) ? Fsb::$session->lang('fsbcode_item_' . $code . '_' . $line) : $line, )); } } } } Fsb::$db->free($result); } /** * Genere l'affichage des smilies */ public static function smilies() { $sql = 'SELECT sc.*, s.* FROM ' . SQL_PREFIX . 'smilies_cat sc LEFT JOIN ' . SQL_PREFIX . 'smilies s ON sc.cat_id = s.smiley_cat ORDER BY sc.cat_order, s.smiley_order'; $result = Fsb::$db->query($sql, 'smilies_'); $last = null; while ($row = Fsb::$db->row($result)) { if (is_null($last) || $row['cat_id'] != $last['cat_id']) { Fsb::$tpl->set_blocks('smiley_cat', array( 'CAT_ID' => $row['cat_id'], 'CAT_NAME' => htmlspecialchars($row['cat_name']), )); } if (!is_null($row['smiley_id'])) { Fsb::$tpl->set_blocks('smiley_cat.smiley', array( 'URL' => substr(SMILEY_PATH, strlen(ROOT)) . addslashes($row['smiley_name']), 'TEXT' => addslashes(htmlspecialchars($row['smiley_tag'])), 'TAG' => addslashes(addslashes(htmlspecialchars($row['smiley_tag']))), )); } $last = $row; } Fsb::$db->free($result); Fsb::$tpl->set_vars(array( 'CFG_FSB_PATH' => addslashes(Fsb::$cfg->get('fsb_path')) . '/', )); } /** * Verifie si le membre a acces au forum protege par un mot de passe, et affiche ou non le formulaire * * @param int $f_id ID du forum * @param string $password Mot de passe du forum * @param string $action Action pour le formulaire * @return bool Acces autorise ou non */ public static function forum_password($f_id, $password, $action) { if (!Fsb::$session->data['s_forum_access'] || !in_array($f_id, (array)explode(',', Fsb::$session->data['s_forum_access']))) { // Verification du mot de passe entre if (Http::request('submit_forum_password', 'post')) { $submited_password = trim(Http::request('forum_password', 'post')); if ($submited_password && (string)$submited_password === (string)$password) { // Mot de passe corect, mise a jour de la session Fsb::$db->update('sessions', array( 's_forum_access' => Fsb::$session->data['s_forum_access'] . ((Fsb::$session->data['s_forum_access']) ? ',' : '') . $f_id, ), 'WHERE s_sid = \'' . Fsb::$db->escape(Fsb::$session->sid) . '\''); return (true); } // Mot de passe incorect ... Fsb::$tpl->set_switch('bad_password'); } // Formulaire de mot de passe Fsb::$tpl->set_file('display_password.html'); Fsb::$tpl->set_vars(array( 'U_ACTION' => sid($action), )); return (false); } else { // Acces autorise return (true); } } /** * Ajoute un systeme d'onglet sur une page de l'administration * * @param array $module_list Liste des onglets * @param string $current_module Onglet selectionne * @param string $url URL du lien * @param string $prefix_lang Prefixe pour la clef de langue */ public static function header_module($module_list, $current_module, $url, $prefix_lang = '') { $width = floor(100 / count($module_list)); foreach ($module_list AS $module) { Fsb::$tpl->set_blocks('module_header', array( 'WIDTH' => $width, 'SELECTED' => ($module == $current_module) ? true : false, 'URL' => sid($url . '&module=' . $module), 'NAME' => Fsb::$session->lang($prefix_lang . $module), )); } Fsb::$tpl->set_switch('use_module_page'); } /** * Affiche le header de la messagerie prive * * @param string $box Boite courante */ public static function header_mp($box) { Fsb::$tpl->set_switch('show_mp_header'); Fsb::$tpl->set_vars(array( 'MENU_HEADER_TITLE' => Fsb::$session->lang('mp_panel'), )); foreach ($GLOBALS['_list_box'] AS $box_name) { Fsb::$tpl->set_switch('show_menu_panel'); Fsb::$tpl->set_blocks('module', array( 'IS_SELECT' => ($box == $box_name) ? true : false, 'NAME' => Fsb::$session->lang('mp_box_' . $box_name), 'URL' => sid(ROOT . 'index.' . PHPEXT . '?p=mp&box=' . $box_name), )); } } } /* EOF */