Piwigo/include/common.inc.php

342 lines
10 KiB
PHP

<?php
// +-----------------------------------------------------------------------+
// | This file is part of Piwigo. |
// | |
// | For copyright and license information, please view the COPYING.txt |
// | file that was distributed with this source code. |
// +-----------------------------------------------------------------------+
defined('PHPWG_ROOT_PATH') or trigger_error('Hacking attempt!', E_USER_ERROR);
// determine the initial instant to indicate the generation time of this page
$t2 = microtime(true);
// @set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
//
// addslashes to vars if magic_quotes_gpc is off this is a security
// precaution to prevent someone trying to break out of a SQL statement.
//
// The magic quote feature has been disabled since php 5.4
// but function get_magic_quotes_gpc was always replying false.
// Since php 8 the function get_magic_quotes_gpc is also removed
// but we stil want to sanitize user input variables.
if(!function_exists('get_magic_quotes_gpc') or !@get_magic_quotes_gpc() )
{
function sanitize_mysql_kv(&$v, $k)
{
$v = addslashes($v);
}
if( is_array( $_GET ) )
{
array_walk_recursive( $_GET, 'sanitize_mysql_kv' );
}
if( is_array( $_POST ) )
{
array_walk_recursive( $_POST, 'sanitize_mysql_kv' );
}
if( is_array( $_COOKIE ) )
{
array_walk_recursive( $_COOKIE, 'sanitize_mysql_kv' );
}
}
if ( !empty($_SERVER["PATH_INFO"]) )
{
$_SERVER["PATH_INFO"] = addslashes($_SERVER["PATH_INFO"]);
}
//
// Define some basic configuration arrays this also prevents malicious
// rewriting of language and otherarray values via URI params
//
$conf = array();
$page = array(
'infos' => array(),
'errors' => array(),
'warnings' => array(),
'messages' => array(),
'body_classes' => array(),
'body_data' => array(),
);
$user = array();
$lang = array();
$header_msgs = array();
$header_notes = array();
$filter = array();
foreach(
array(
'gzopen'
) as $func)
{
if (!function_exists($func))
{
include_once(PHPWG_ROOT_PATH . 'include/php_compat/'.$func.'.php');
}
}
include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
@include(PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php');
if (!defined('PHPWG_INSTALLED'))
{
header('Location: install.php');
exit;
}
include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$conf['dblayer'].'.inc.php');
if(isset($conf['show_php_errors']) && !empty($conf['show_php_errors']))
{
@ini_set('error_reporting', $conf['show_php_errors']);
if($conf['show_php_errors_on_frontend'])
{
@ini_set('display_errors', true);
}
}
if ($conf['session_gc_probability'] > 0)
{
@ini_set('session.gc_divisor', 100);
@ini_set('session.gc_probability', min((int)$conf['session_gc_probability'], 100));
}
include(PHPWG_ROOT_PATH . 'include/constants.php');
include(PHPWG_ROOT_PATH . 'include/functions.inc.php');
include(PHPWG_ROOT_PATH . 'include/template.class.php');
include(PHPWG_ROOT_PATH . 'include/cache.class.php');
include(PHPWG_ROOT_PATH . 'include/Logger.class.php');
$persistent_cache = new PersistentFileCache();
// Database connection
try
{
pwg_db_connect($conf['db_host'], $conf['db_user'],
$conf['db_password'], $conf['db_base']);
}
catch (Exception $e)
{
my_error(l10n($e->getMessage()), true);
}
pwg_db_check_charset();
// in Piwigo 15, configuration setting webmaster_id is moved from config files
// to database. It may be undefined at some point, with Piwigo 15+ scripts and
// a Piwigo 14 database schema not upgraded yet. Let's avoid any problem.
$conf['webmaster_id'] = $conf['webmaster_id'] ?? 1;
load_conf_from_db();
$logger = new Logger(array(
'directory' => PHPWG_ROOT_PATH . $conf['data_location'] . $conf['log_dir'],
'severity' => $conf['log_level'],
// we use an hashed filename to prevent direct file access, and we salt with
// the db_password instead of secret_key because the log must be usable in i.php
// (secret_key is in the database)
'filename' => 'log_' . date('Y-m-d') . '_' . sha1(date('Y-m-d') . $conf['db_password']) . '.txt',
'globPattern' => 'log_*.txt',
'archiveDays' => $conf['log_archive_days'],
));
if (!$conf['check_upgrade_feed'])
{
if (!isset($conf['piwigo_db_version']) or $conf['piwigo_db_version'] != get_branch_from_version(PHPWG_VERSION))
{
redirect(get_root_url().'upgrade.php');
}
}
ImageStdParams::load_from_db();
session_start();
load_plugins();
if (!isset($conf['piwigo_installed_version']))
{
conf_update_param('piwigo_installed_version', PHPWG_VERSION);
}
elseif ($conf['piwigo_installed_version'] != PHPWG_VERSION)
{
// Piwigo has been updated "from filesystem" and not "from the administration UI". We mark it as an autoupdate in the system activities log
pwg_activity('system', ACTIVITY_SYSTEM_CORE, 'autoupdate', array('from_version'=>$conf['piwigo_installed_version'], 'to_version'=>PHPWG_VERSION));
conf_update_param('piwigo_installed_version', PHPWG_VERSION);
}
if (!isset($conf['last_major_update']))
{
list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
conf_update_param('last_major_update', $dbnow, true);
}
// 2022-02-25 due to escape on "rank" (becoming a mysql keyword in version 8), the $conf['order_by'] might
// use a "rank", even if admin/configuration.php should have removed it. We must remove it.
// TODO remove this data update as soon as 2025 arrives
if (preg_match('/(, )?`rank` ASC/', $conf['order_by']))
{
$order_by = preg_replace('/(, )?`rank` ASC/', '', $conf['order_by']);
if ('ORDER BY ' == $order_by)
{
$order_by = 'ORDER BY id ASC';
}
conf_update_param('order_by', $order_by, true);
}
// users can have defined a custom order pattern, incompatible with GUI form
if (isset($conf['order_by_custom']))
{
$conf['order_by'] = $conf['order_by_custom'];
}
if (isset($conf['order_by_inside_category_custom']))
{
$conf['order_by_inside_category'] = $conf['order_by_inside_category_custom'];
}
check_lounge();
include(PHPWG_ROOT_PATH.'include/user.inc.php');
if (in_array( substr($user['language'],0,2), array('fr','it','de','es','pl','ru','nl','tr','da') ) )
{
define('PHPWG_DOMAIN', substr($user['language'],0,2).'.piwigo.org');
}
elseif ('zh_CN' == $user['language']) {
define('PHPWG_DOMAIN', 'cn.piwigo.org');
}
elseif ('pt_BR' == $user['language']) {
define('PHPWG_DOMAIN', 'br.piwigo.org');
}
else {
define('PHPWG_DOMAIN', 'piwigo.org');
}
define('PHPWG_URL', 'https://'.PHPWG_DOMAIN);
if(isset($conf['alternative_pem_url']) and $conf['alternative_pem_url']!='')
{
define('PEM_URL', $conf['alternative_pem_url']);
}
else
{
define('PEM_URL', 'https://'.PHPWG_DOMAIN.'/ext');
}
// language files
load_language('common.lang');
if ( is_admin() || (defined('IN_ADMIN') and IN_ADMIN) )
{
load_language('admin.lang');
// Add language for temporary strings for new popup, from piwigo 15
load_language('whats_new_'.get_branch_from_version(PHPWG_VERSION).'.lang');
}
trigger_notify('loading_lang');
load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR, array('no_fallback'=>true, 'local'=>true) );
// only now we can set the localized username of the guest user (and not in
// include/user.inc.php)
if (is_a_guest())
{
$user['username'] = l10n('guest');
}
// in case an auth key was provided and is no longer valid, we must wait to
// be here, with language loaded, to prepare the message
if (isset($page['auth_key_invalid']) and $page['auth_key_invalid'])
{
$page['errors'][] =
l10n('Your authentication key is no longer valid.')
.sprintf(' <a href="%s">%s</a>', get_root_url().'identification.php', l10n('Login'))
;
}
// template instance
if (defined('IN_ADMIN') and IN_ADMIN )
{// Admin template
$template = new Template(PHPWG_ROOT_PATH.'admin/themes', userprefs_get_param('admin_theme', 'clear'));
}
else
{ // Classic template
$theme = $user['theme'];
if (script_basename() != 'ws' and mobile_theme())
{
$theme = $conf['mobile_theme'];
}
$template = new Template(PHPWG_ROOT_PATH.'themes', $theme );
}
if ( !isset($conf['no_photo_yet']) )
{
include(PHPWG_ROOT_PATH.'include/no_photo_yet.inc.php');
}
if (isset($user['internal_status']['guest_must_be_guest'])
and
$user['internal_status']['guest_must_be_guest'] === true)
{
$header_msgs[] = l10n('Bad status for user "guest", using default status. Please notify the webmaster.');
}
if ($conf['gallery_locked'])
{
$header_msgs[] = l10n('The gallery is locked for maintenance. Please, come back later.');
if ( script_basename() != 'identification' and !is_admin() )
{
set_status_header(503, 'Service Unavailable');
@header('Retry-After: 900');
header('Content-Type: text/html; charset='.get_pwg_charset());
echo '<a href="'.get_absolute_root_url(false).'identification.php">'.l10n('The gallery is locked for maintenance. Please, come back later.').'</a>';
echo str_repeat( ' ', 512); //IE6 doesn't error output if below a size
exit();
}
}
if ($conf['check_upgrade_feed'])
{
include_once(PHPWG_ROOT_PATH.'admin/include/functions_upgrade.php');
if (check_upgrade_feed())
{
$header_msgs[] = 'Some database upgrades are missing, '
.'<a href="'.get_absolute_root_url(false).'upgrade_feed.php">upgrade now</a>';
}
}
if (count($header_msgs) > 0)
{
$template->assign('header_msgs', $header_msgs);
$header_msgs=array();
}
if (!empty($conf['filter_pages']) and get_filter_page_value('used'))
{
include(PHPWG_ROOT_PATH.'include/filter.inc.php');
}
else
{
$filter['enabled'] = false;
}
if (isset($conf['header_notes']))
{
$header_notes = array_merge($header_notes, $conf['header_notes']);
}
// default event handlers
add_event_handler('render_category_literal_description', 'render_category_literal_description');
if ( !$conf['allow_html_descriptions'] )
{
add_event_handler('render_category_description', 'pwg_nl2br');
}
add_event_handler('render_comment_content', 'render_comment_content');
add_event_handler('render_comment_author', 'strip_tags');
add_event_handler('render_tag_url', 'str2url');
add_event_handler('blockmanager_register_blocks', 'register_default_menubar_blocks', EVENT_HANDLER_PRIORITY_NEUTRAL-1);
if ( !empty($conf['original_url_protection']) )
{
add_event_handler('get_element_url', 'get_element_url_protection_handler');
add_event_handler('get_src_image_url', 'get_src_image_url_protection_handler');
}
trigger_notify('init');
?>