phpldapadmin/lib/common.php

286 lines
8.8 KiB
PHP
Raw Normal View History

2009-06-30 08:07:14 +00:00
<?php
2009-06-30 11:50:46 +00:00
// $Header: /cvsroot/phpldapadmin/phpldapadmin/lib/common.php,v 1.80.2.8 2008/01/04 12:33:03 wurley Exp $
2009-06-30 08:07:14 +00:00
2009-06-30 09:29:51 +00:00
/**
2009-06-30 11:46:44 +00:00
* Contains code to be executed at the top of each application page.
2009-06-30 08:07:14 +00:00
* include this file at the top of every PHP file.
2009-06-30 09:29:51 +00:00
*
2009-06-30 11:46:44 +00:00
* This file will "pre-initialise" an application environment so that any PHP file will have a consistent
* environment with other application PHP files.
2009-06-30 09:29:51 +00:00
*
* This code WILL NOT check that all required functions are usable/readable, etc. This process has
2009-06-30 11:46:44 +00:00
* been moved to index.php (which really is only called once when a browser hits the application for the first time).
2009-06-30 09:29:51 +00:00
*
* The list of ADDITIONAL function files is now defined in functions.php.
*
* @package phpLDAPadmin
2009-06-30 08:07:14 +00:00
*/
2009-06-30 11:46:44 +00:00
# The index we will store our config in $_SESSION
2009-06-30 11:50:46 +00:00
if (! defined('APPCONFIG'))
define('APPCONFIG','plaConfig');
2009-06-30 11:46:44 +00:00
/**
* Catch any scripts that are called directly.
* If they are called directly, then they should be routed back through index.php
*/
$app['direct_scripts'] = array('cmd.php','index.php',
'view_jpeg_photo.php','entry_chooser.php',
'password_checker.php','download_binary_attr.php');
foreach ($app['direct_scripts'] as $script) {
2009-06-30 10:46:00 +00:00
$scriptOK = false;
if (preg_match('/'.$script.'$/',$_SERVER['SCRIPT_NAME'])) {
$scriptOK = true;
break;
}
}
2009-06-30 11:50:46 +00:00
# Anything in the tools dir can be executed directly.
if (! $scriptOK && preg_match('/^\/tools/',$_SERVER['SCRIPT_NAME']))
$scriptOK = true;
2009-06-30 10:46:00 +00:00
if (! $scriptOK) {
2009-06-30 11:46:44 +00:00
if (isset($_REQUEST['server_id']))
2009-06-30 10:46:00 +00:00
header(sprintf('Location: index.php?server_id=%s',$_REQUEST['server_id']));
else
header('Location: index.php');
die();
}
/**
2009-06-30 11:46:44 +00:00
* Timer stopwatch, used to instrument the application
2009-06-30 10:46:00 +00:00
*/
if (! function_exists('stopwatch')) {
function stopwatch() {
static $mt_previous = 0;
list($usec,$sec) = explode(' ',microtime());
$mt_current = (float)$usec + (float)$sec;
if (! $mt_previous) {
$mt_previous = $mt_current;
return 0;
} else {
$mt_diff = ($mt_current - $mt_previous);
$mt_previous = $mt_current;
return sprintf('%.5f',$mt_diff);
}
}
2009-06-30 11:46:44 +00:00
# For compatability - if common has been sourced a second time, then return to the calling script.
2009-06-30 10:46:00 +00:00
} else {
return;
}
2009-06-30 11:46:44 +00:00
# Set the defualt time zone, if it isnt set in php.ini
if (function_exists('date_default_timezone_set') && ! ini_get('date.timezone'))
2009-06-30 10:46:00 +00:00
date_default_timezone_set('UTC');
2009-06-30 11:46:44 +00:00
# Start out instrumentation
2009-06-30 10:26:08 +00:00
$timer = stopwatch();
2009-06-30 11:46:44 +00:00
# If we are called from index.php, LIBDIR will be set, all other calls to common.php dont need to set it.
2009-06-30 10:46:00 +00:00
if (! defined('LIBDIR'))
define('LIBDIR','../lib/');
2009-06-30 08:09:20 +00:00
2009-06-30 09:29:51 +00:00
# For PHP5 backward/forward compatibility
if (! defined('E_STRICT'))
define('E_STRICT',2048);
2009-06-30 08:09:20 +00:00
2009-06-30 10:26:08 +00:00
# General functions needed to proceed.
2009-06-30 08:10:17 +00:00
ob_start();
2009-06-30 09:29:51 +00:00
require_once realpath(LIBDIR.'functions.php');
2009-06-30 11:46:44 +00:00
if (ob_get_level())
ob_end_clean();
2009-06-30 08:09:20 +00:00
2009-06-30 11:46:44 +00:00
/**
* Turn on all notices and warnings. This helps us write cleaner code (we hope at least)
2009-06-30 10:46:00 +00:00
* Our custom error handler receives all error notices that pass the error_reporting()
* level set above.
*/
2009-06-30 11:46:44 +00:00
# Call our custom defined error handler, if it is defined in functions.php
if (function_exists('pla_error_handler'))
set_error_handler('pla_error_handler');
2009-06-30 09:40:37 +00:00
# Disable error reporting until all our required functions are loaded.
error_reporting(0);
2009-06-30 08:09:20 +00:00
2009-06-30 11:46:44 +00:00
/**
* functions.php should have defined our $app['function_files'] array, listing all our
2009-06-30 09:29:51 +00:00
* required functions (order IS important).
* index.php should have checked they exist and are usable - we'll assume that the user
* has been via index.php, and fixed any problems already.
*/
ob_start();
2009-06-30 11:46:44 +00:00
if (isset($app['function_files']) && is_array($app['function_files']))
foreach ($app['function_files'] as $file_name) {
require_once realpath ($file_name);
}
2009-06-30 09:22:30 +00:00
2009-06-30 10:46:00 +00:00
# Now read in config_default.php
2009-06-30 09:29:51 +00:00
require_once realpath(LIBDIR.'config_default.php');
2009-06-30 11:46:44 +00:00
if (ob_get_level())
ob_end_clean();
2009-06-30 08:09:20 +00:00
2009-06-30 09:40:37 +00:00
# We are now ready for error reporting.
2009-06-30 10:46:00 +00:00
error_reporting(E_ALL);
2009-06-30 09:40:37 +00:00
2009-06-30 11:46:44 +00:00
# Start our session.
2009-06-30 10:46:00 +00:00
pla_session_start();
2009-06-30 11:46:44 +00:00
# If we get here, and $_SESSION[APPCONFIG] is not set, then redirect the user to the index.
if (! isset($_SESSION[APPCONFIG])) {
if (isset($_REQUEST['server_id']))
header(sprintf('Location: index.php?server_id=%s',$_REQUEST['server_id']));
else
header('Location: index.php');
2009-06-30 10:46:00 +00:00
die();
} else {
# Check our custom variables.
# @todo: Change this so that we dont process a cached session.
2009-06-30 11:46:44 +00:00
$_SESSION[APPCONFIG]->CheckCustom();
2009-06-30 10:46:00 +00:00
}
# If we are here, $_SESSION is set - so enabled DEBUGing if it has been configured.
2009-06-30 11:46:44 +00:00
if (($_SESSION[APPCONFIG]->GetValue('debug','syslog') || $_SESSION[APPCONFIG]->GetValue('debug','file'))
&& $_SESSION[APPCONFIG]->GetValue('debug','level'))
2009-06-30 10:46:00 +00:00
define('DEBUG_ENABLED',1);
else
define('DEBUG_ENABLED',0);
if (DEBUG_ENABLED)
2009-06-30 11:46:44 +00:00
debug_log('Application (%s) initialised and starting with (%s).',1,__FILE__,__LINE__,__METHOD__,
pla_version(),$_REQUEST);
2009-06-30 10:46:00 +00:00
# Set our PHP timelimit.
2009-06-30 11:46:44 +00:00
if ($_SESSION[APPCONFIG]->GetValue('session','timelimit'))
set_time_limit($_SESSION[APPCONFIG]->GetValue('session','timelimit'));
2009-06-30 10:46:00 +00:00
# If debug mode is set, increase the time_limit, since we probably need it.
2009-06-30 11:46:44 +00:00
if (DEBUG_ENABLED && $_SESSION[APPCONFIG]->GetValue('session','timelimit'))
set_time_limit($_SESSION[APPCONFIG]->GetValue('session','timelimit') * 5);
2009-06-30 08:10:17 +00:00
2009-06-30 11:46:44 +00:00
/**
2009-06-30 09:29:51 +00:00
* Language configuration. Auto or specified?
* Shall we attempt to auto-determine the language?
*/
2009-06-30 11:46:44 +00:00
$language = $_SESSION[APPCONFIG]->GetValue('appearance','language');
2009-06-30 09:40:37 +00:00
2009-06-30 10:26:08 +00:00
if ($language == 'auto') {
2009-06-30 11:46:44 +00:00
2009-06-30 09:29:51 +00:00
# Make sure their browser correctly reports language. If not, skip this.
2009-06-30 10:26:08 +00:00
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
# Get the languages which are spetcified in the HTTP header
$HTTP_LANGS = preg_split ('/[;,]+/',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach ($HTTP_LANGS as $key => $value) {
if (substr($value,0,2) == 'q=') {
unset($HTTP_LANGS[$key]);
continue;
}
$value = preg_split('/[-]+/',$value);
if (sizeof($value) == 2)
$HTTP_LANGS[$key] = strtolower($value[0]).'_'.strtoupper($value[1]);
else
$HTTP_LANGS[$key] = auto_lang(strtolower($value[0]));
2009-06-30 08:09:20 +00:00
}
2009-06-30 09:29:51 +00:00
2009-06-30 10:26:08 +00:00
$HTTP_LANGS = array_unique($HTTP_LANGS);
foreach ($HTTP_LANGS as $HTTP_LANG) {
2009-06-30 11:46:44 +00:00
$language_dir = LANGDIR.$HTTP_LANG;
2009-06-30 10:26:08 +00:00
if ((substr($HTTP_LANG,0,2) == 'en') ||
2009-06-30 11:46:44 +00:00
(file_exists($language_dir) && is_readable($language_dir))) {
2009-06-30 10:26:08 +00:00
# Set language
putenv('LANG='.$HTTP_LANG); # e.g. LANG=de_DE
2009-06-30 10:41:18 +00:00
$HTTP_LANG .= '.UTF-8';
2009-06-30 10:26:08 +00:00
setlocale(LC_ALL,$HTTP_LANG); # set LC_ALL to de_DE
bindtextdomain('messages',LANGDIR);
bind_textdomain_codeset('messages','UTF-8');
textdomain('messages');
header('Content-type: text/html; charset=UTF-8',true);
2009-06-30 09:29:51 +00:00
break;
2009-06-30 08:09:20 +00:00
}
}
2009-06-30 11:46:44 +00:00
#todo: Generate an error if language doesnt exist.
2009-06-30 08:09:20 +00:00
}
2009-06-30 09:29:51 +00:00
} else {
2009-06-30 10:26:08 +00:00
# Grab the language file configured in config.php
2009-06-30 11:46:44 +00:00
#todo: Generate an error if language doesnt exist.
2009-06-30 10:26:08 +00:00
if ($language != null) {
if (strcmp($language,'english') == 0)
$language = 'en_GB';
# Set language
putenv('LANG='.$language); # e.g. LANG=de_DE
2009-06-30 10:41:18 +00:00
$language .= '.UTF-8';
2009-06-30 10:26:08 +00:00
setlocale(LC_ALL,$language); # set LC_ALL to de_DE
bindtextdomain('messages',LANGDIR);
bind_textdomain_codeset('messages','UTF-8');
textdomain('messages');
2009-06-30 10:46:00 +00:00
header('Content-type: text/html; charset=UTF-8',true);
2009-06-30 09:29:51 +00:00
}
2009-06-30 08:09:20 +00:00
}
2009-06-30 08:07:14 +00:00
2009-06-30 11:46:44 +00:00
/**
2009-06-30 09:29:51 +00:00
* Strip slashes from GET, POST, and COOKIE variables if this
* PHP install is configured to automatically addslashes()
*/
if (get_magic_quotes_gpc() && (! isset($slashes_stripped) || ! $slashes_stripped)) {
array_stripslashes($_REQUEST);
2009-06-30 08:07:14 +00:00
array_stripslashes($_GET);
2009-06-30 08:09:20 +00:00
array_stripslashes($_POST);
array_stripslashes($_COOKIE);
2009-06-30 08:07:14 +00:00
$slashes_stripped = true;
}
2009-06-30 11:46:44 +00:00
/**
* Create our application repository variable.
*/
2009-06-30 09:29:51 +00:00
if (isset($_REQUEST['server_id'])) {
2009-06-30 11:46:44 +00:00
$ldapserver = $_SESSION[APPCONFIG]->ldapservers->Instance($_REQUEST['server_id']);
2009-06-30 10:46:00 +00:00
} else {
2009-06-30 11:46:44 +00:00
if (isset($_SESSION[APPCONFIG]->ldapservers) && is_object($_SESSION[APPCONFIG]->ldapservers))
$ldapserver = $_SESSION[APPCONFIG]->ldapservers->Instance(null);
2009-06-30 09:29:51 +00:00
}
2009-06-30 10:26:08 +00:00
2009-06-30 11:46:44 +00:00
/**
* Look/evaluate our timeout
*/
if (isset($ldapserver) && is_object($ldapserver) && method_exists($ldapserver,'haveAuthInfo')) {
if ($ldapserver->haveAuthInfo() && isset($ldapserver->auth_type) && $ldapserver->auth_type != 'config') {
/**
* If time out value has been reached:
* - log out user
* - put $server_id in array of recently timed out servers
*/
if (function_exists('session_timed_out') && session_timed_out($ldapserver)) {
$app['url_timeout'] = sprintf('cmd.php?cmd=timeout&server_id=%s',$_REQUEST['server_id']);
printf('<script type="text/javascript" language="javascript">location.href=\'%s\'</script>',
htmlspecialchars($app['url_timeout']));
die();
}
2009-06-30 10:26:08 +00:00
}
2009-06-30 11:46:44 +00:00
# Update $_SESSION['activity'] for timeout and automatic logout feature
if ($ldapserver->haveAuthInfo() && function_exists('set_lastactivity'))
set_lastactivity($ldapserver);
}
2009-06-30 10:46:00 +00:00
2009-06-30 10:26:08 +00:00
/**
2009-06-30 10:46:00 +00:00
* At this point we have read all our additional function PHP files and our configuration.
2009-06-30 11:46:44 +00:00
* If we are using hooks, run the session_init hook.
2009-06-30 10:26:08 +00:00
*/
2009-06-30 11:46:44 +00:00
if (function_exists('run_hook'))
run_hook('post_session_init',array());
2009-06-30 08:07:14 +00:00
?>