@@ -25,9 +25,9 @@ discard block  | 
                                                    ||
| 25 | 25 | |
| 26 | 26 | // WT_SCRIPT_NAME is defined in each script that the user is permitted to load.  | 
                                                        
| 27 | 27 |  if (!defined('WT_SCRIPT_NAME')) { | 
                                                        
| 28 | - http_response_code(403);  | 
                                                        |
| 28 | + http_response_code(403);  | 
                                                        |
| 29 | 29 | |
| 30 | - return;  | 
                                                        |
| 30 | + return;  | 
                                                        |
| 31 | 31 | }  | 
                                                        
| 32 | 32 | |
| 33 | 33 | /**  | 
                                                        
@@ -50,41 +50,41 @@ discard block  | 
                                                    ||
| 50 | 50 |  define('WT_STATIC_URL', getenv('STATIC_URL')); // We could set this to load our own static resources from a cookie-free domain. | 
                                                        
| 51 | 51 | |
| 52 | 52 |  if (getenv('USE_CDN')) { | 
                                                        
| 53 | - // Caution, using a CDN will break support for responsive features in IE8, as respond.js  | 
                                                        |
| 54 | - // needs to be on the same domain as all the CSS files.  | 
                                                        |
| 55 | -	define('WT_BOOTSTRAP_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css'); | 
                                                        |
| 56 | -	define('WT_BOOTSTRAP_DATETIMEPICKER_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/css/bootstrap-datetimepicker.min.css'); | 
                                                        |
| 57 | -	define('WT_BOOTSTRAP_DATETIMEPICKER_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/js/bootstrap-datetimepicker.min.js'); | 
                                                        |
| 58 | -	define('WT_BOOTSTRAP_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js'); | 
                                                        |
| 59 | -	define('WT_BOOTSTRAP_RTL_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-rtl/3.2.0-rc2/css/bootstrap-rtl.min.css'); // Cloudflare is out of date | 
                                                        |
| 60 | -	//define('WT_DATATABLES_BOOTSTRAP_CSS_URL', '//cdn.datatables.net/plug-ins/1.10.7/integration/bootstrap/3/dataTables.bootstrap.css'); | 
                                                        |
| 61 | -	define('WT_DATATABLES_BOOTSTRAP_JS_URL', '//cdn.datatables.net/plug-ins/1.10.7/integration/bootstrap/3/dataTables.bootstrap.js'); | 
                                                        |
| 62 | -	define('WT_FONT_AWESOME_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css'); | 
                                                        |
| 63 | -	define('WT_JQUERYUI_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js'); | 
                                                        |
| 64 | -	define('WT_JQUERYUI_TOUCH_PUNCH_URL', '//cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.3/jquery.ui.touch-punch.min.js'); | 
                                                        |
| 65 | -	define('WT_JQUERY_DATATABLES_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.7/js/jquery.dataTables.min.js'); | 
                                                        |
| 66 | -	define('WT_JQUERY_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js'); | 
                                                        |
| 67 | -	define('WT_JQUERY2_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js'); | 
                                                        |
| 68 | -	define('WT_MODERNIZR_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js'); | 
                                                        |
| 69 | -	define('WT_MOMENT_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment-with-locales.min.js'); | 
                                                        |
| 70 | -	define('WT_RESPOND_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js'); | 
                                                        |
| 53 | + // Caution, using a CDN will break support for responsive features in IE8, as respond.js  | 
                                                        |
| 54 | + // needs to be on the same domain as all the CSS files.  | 
                                                        |
| 55 | +    define('WT_BOOTSTRAP_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css'); | 
                                                        |
| 56 | +    define('WT_BOOTSTRAP_DATETIMEPICKER_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/css/bootstrap-datetimepicker.min.css'); | 
                                                        |
| 57 | +    define('WT_BOOTSTRAP_DATETIMEPICKER_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/js/bootstrap-datetimepicker.min.js'); | 
                                                        |
| 58 | +    define('WT_BOOTSTRAP_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js'); | 
                                                        |
| 59 | +    define('WT_BOOTSTRAP_RTL_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/bootstrap-rtl/3.2.0-rc2/css/bootstrap-rtl.min.css'); // Cloudflare is out of date | 
                                                        |
| 60 | +    //define('WT_DATATABLES_BOOTSTRAP_CSS_URL', '//cdn.datatables.net/plug-ins/1.10.7/integration/bootstrap/3/dataTables.bootstrap.css'); | 
                                                        |
| 61 | +    define('WT_DATATABLES_BOOTSTRAP_JS_URL', '//cdn.datatables.net/plug-ins/1.10.7/integration/bootstrap/3/dataTables.bootstrap.js'); | 
                                                        |
| 62 | +    define('WT_FONT_AWESOME_CSS_URL', '//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css'); | 
                                                        |
| 63 | +    define('WT_JQUERYUI_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js'); | 
                                                        |
| 64 | +    define('WT_JQUERYUI_TOUCH_PUNCH_URL', '//cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.3/jquery.ui.touch-punch.min.js'); | 
                                                        |
| 65 | +    define('WT_JQUERY_DATATABLES_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.7/js/jquery.dataTables.min.js'); | 
                                                        |
| 66 | +    define('WT_JQUERY_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js'); | 
                                                        |
| 67 | +    define('WT_JQUERY2_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js'); | 
                                                        |
| 68 | +    define('WT_MODERNIZR_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js'); | 
                                                        |
| 69 | +    define('WT_MOMENT_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.2/moment-with-locales.min.js'); | 
                                                        |
| 70 | +    define('WT_RESPOND_JS_URL', '//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js'); | 
                                                        |
| 71 | 71 |  } else { | 
                                                        
| 72 | -	define('WT_BOOTSTRAP_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-3.3.6/css/bootstrap.min.css'); | 
                                                        |
| 73 | -	define('WT_BOOTSTRAP_DATETIMEPICKER_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-datetimepicker-4.17.37/css/bootstrap-datetimepicker.min.css'); | 
                                                        |
| 74 | -	define('WT_BOOTSTRAP_DATETIMEPICKER_JS_URL', WT_STATIC_URL . 'packages/bootstrap-datetimepicker-4.17.37/js/bootstrap-datetimepicker.min.js'); | 
                                                        |
| 75 | -	define('WT_BOOTSTRAP_JS_URL', WT_STATIC_URL . 'packages/bootstrap-3.3.6/js/bootstrap.min.js'); | 
                                                        |
| 76 | -	define('WT_BOOTSTRAP_RTL_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-rtl-3.3.4/css/bootstrap-rtl.min.css'); | 
                                                        |
| 77 | -	//define('WT_DATATABLES_BOOTSTRAP_CSS_URL', WT_STATIC_URL . 'packages/datatables-1.10.7/plugins/dataTables.bootstrap.css'); | 
                                                        |
| 78 | -	define('WT_DATATABLES_BOOTSTRAP_JS_URL', WT_STATIC_URL . 'packages/datatables-1.10.7/plugins/dataTables.bootstrap.js'); | 
                                                        |
| 79 | -	define('WT_FONT_AWESOME_CSS_URL', WT_STATIC_URL . 'packages/font-awesome-4.4.0/css/font-awesome.min.css'); | 
                                                        |
| 80 | -	define('WT_JQUERYUI_JS_URL', WT_STATIC_URL . 'packages/jquery-ui-1.11.4/js/jquery-ui.min.js'); | 
                                                        |
| 81 | -	define('WT_JQUERYUI_TOUCH_PUNCH_URL', WT_STATIC_URL . 'packages/jqueryui-touch-punch-0.2.3/jquery.ui.touch-punch.min.js'); | 
                                                        |
| 82 | -	define('WT_JQUERY_DATATABLES_JS_URL', WT_STATIC_URL . 'packages/datatables-1.10.7/js/jquery.dataTables.min.js'); | 
                                                        |
| 83 | -	define('WT_JQUERY_JS_URL', WT_STATIC_URL . 'packages/jquery-1.12.1/jquery.min.js'); | 
                                                        |
| 84 | -	define('WT_JQUERY2_JS_URL', WT_STATIC_URL . 'packages/jquery-2.2.1/jquery.min.js'); | 
                                                        |
| 85 | -	define('WT_MODERNIZR_JS_URL', WT_STATIC_URL . 'packages/modernizr-2.8.3/modernizr.min.js'); | 
                                                        |
| 86 | -	define('WT_MOMENT_JS_URL', WT_STATIC_URL . 'packages/moment-2.11.2/moment-with-locales.min.js'); | 
                                                        |
| 87 | -	define('WT_RESPOND_JS_URL', WT_STATIC_URL . 'packages/respond-1.4.2/respond.min.js'); | 
                                                        |
| 72 | +    define('WT_BOOTSTRAP_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-3.3.6/css/bootstrap.min.css'); | 
                                                        |
| 73 | +    define('WT_BOOTSTRAP_DATETIMEPICKER_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-datetimepicker-4.17.37/css/bootstrap-datetimepicker.min.css'); | 
                                                        |
| 74 | +    define('WT_BOOTSTRAP_DATETIMEPICKER_JS_URL', WT_STATIC_URL . 'packages/bootstrap-datetimepicker-4.17.37/js/bootstrap-datetimepicker.min.js'); | 
                                                        |
| 75 | +    define('WT_BOOTSTRAP_JS_URL', WT_STATIC_URL . 'packages/bootstrap-3.3.6/js/bootstrap.min.js'); | 
                                                        |
| 76 | +    define('WT_BOOTSTRAP_RTL_CSS_URL', WT_STATIC_URL . 'packages/bootstrap-rtl-3.3.4/css/bootstrap-rtl.min.css'); | 
                                                        |
| 77 | +    //define('WT_DATATABLES_BOOTSTRAP_CSS_URL', WT_STATIC_URL . 'packages/datatables-1.10.7/plugins/dataTables.bootstrap.css'); | 
                                                        |
| 78 | +    define('WT_DATATABLES_BOOTSTRAP_JS_URL', WT_STATIC_URL . 'packages/datatables-1.10.7/plugins/dataTables.bootstrap.js'); | 
                                                        |
| 79 | +    define('WT_FONT_AWESOME_CSS_URL', WT_STATIC_URL . 'packages/font-awesome-4.4.0/css/font-awesome.min.css'); | 
                                                        |
| 80 | +    define('WT_JQUERYUI_JS_URL', WT_STATIC_URL . 'packages/jquery-ui-1.11.4/js/jquery-ui.min.js'); | 
                                                        |
| 81 | +    define('WT_JQUERYUI_TOUCH_PUNCH_URL', WT_STATIC_URL . 'packages/jqueryui-touch-punch-0.2.3/jquery.ui.touch-punch.min.js'); | 
                                                        |
| 82 | +    define('WT_JQUERY_DATATABLES_JS_URL', WT_STATIC_URL . 'packages/datatables-1.10.7/js/jquery.dataTables.min.js'); | 
                                                        |
| 83 | +    define('WT_JQUERY_JS_URL', WT_STATIC_URL . 'packages/jquery-1.12.1/jquery.min.js'); | 
                                                        |
| 84 | +    define('WT_JQUERY2_JS_URL', WT_STATIC_URL . 'packages/jquery-2.2.1/jquery.min.js'); | 
                                                        |
| 85 | +    define('WT_MODERNIZR_JS_URL', WT_STATIC_URL . 'packages/modernizr-2.8.3/modernizr.min.js'); | 
                                                        |
| 86 | +    define('WT_MOMENT_JS_URL', WT_STATIC_URL . 'packages/moment-2.11.2/moment-with-locales.min.js'); | 
                                                        |
| 87 | +    define('WT_RESPOND_JS_URL', WT_STATIC_URL . 'packages/respond-1.4.2/respond.min.js'); | 
                                                        |
| 88 | 88 | }  | 
                                                        
| 89 | 89 | |
| 90 | 90 | // We can't load these from a CDN, as these have been patched.  | 
                                                        
@@ -176,9 +176,9 @@ discard block  | 
                                                    ||
| 176 | 176 | |
| 177 | 177 | // Ignore the default port.  | 
                                                        
| 178 | 178 |  if ($protocol === 'http' && $port === '80' || $protocol === 'https' && $port === '443') { | 
                                                        
| 179 | - $port = '';  | 
                                                        |
| 179 | + $port = '';  | 
                                                        |
| 180 | 180 |  } else { | 
                                                        
| 181 | - $port = ':' . $port;  | 
                                                        |
| 181 | + $port = ':' . $port;  | 
                                                        |
| 182 | 182 | }  | 
                                                        
| 183 | 183 | |
| 184 | 184 | // REDIRECT_URL should be set when Apache is following a RedirectRule  | 
                                                        
@@ -197,98 +197,98 @@ discard block  | 
                                                    ||
| 197 | 197 | });  | 
                                                        
| 198 | 198 | |
| 199 | 199 |  set_exception_handler(function ($ex) { | 
                                                        
| 200 | - $message = $ex->getFile() . ':' . $ex->getLine() . ' ' . $ex->getMessage() . PHP_EOL;  | 
                                                        |
| 201 | -  | 
                                                        |
| 202 | -	foreach ($ex->getTrace() as $level => $frame) { | 
                                                        |
| 203 | -		$frame += array('args' => array(), 'file' => 'unknown', 'line' => 'unknown'); | 
                                                        |
| 204 | -		array_walk($frame['args'], function (&$arg) { | 
                                                        |
| 205 | -			switch (gettype($arg)) { | 
                                                        |
| 206 | - case 'boolean':  | 
                                                        |
| 207 | - case 'integer':  | 
                                                        |
| 208 | - case 'double':  | 
                                                        |
| 209 | - case 'null':  | 
                                                        |
| 210 | - $arg = var_export($arg, true);  | 
                                                        |
| 211 | - break;  | 
                                                        |
| 212 | - case 'string':  | 
                                                        |
| 213 | -				if (mb_strlen($arg) > 30) { | 
                                                        |
| 214 | - $arg = substr($arg, 0, 30) . '…';  | 
                                                        |
| 215 | - }  | 
                                                        |
| 216 | - $arg = var_export($arg, true);  | 
                                                        |
| 217 | - break;  | 
                                                        |
| 218 | - case 'object':  | 
                                                        |
| 219 | - $reflection = new \ReflectionClass($arg);  | 
                                                        |
| 220 | -				if (is_object($arg) && method_exists($arg, '__toString')) { | 
                                                        |
| 221 | - $arg = '[' . $reflection->getShortName() . ' ' . (string) $arg . ']';  | 
                                                        |
| 222 | -				} else { | 
                                                        |
| 223 | - $arg = '[' . $reflection->getShortName() . ']';  | 
                                                        |
| 224 | - }  | 
                                                        |
| 225 | - break;  | 
                                                        |
| 226 | - default:  | 
                                                        |
| 227 | - $arg = '[' . gettype($arg) . ']';  | 
                                                        |
| 228 | - break;  | 
                                                        |
| 229 | - }  | 
                                                        |
| 230 | - });  | 
                                                        |
| 231 | - $frame['file'] = str_replace(dirname(__DIR__), '', $frame['file']);  | 
                                                        |
| 232 | - $message .= '#' . $level . ' ' . $frame['file'] . ':' . $frame['line'] . ' ';  | 
                                                        |
| 233 | -		if ($level) { | 
                                                        |
| 234 | -			$message .= $frame['function'] . '(' . implode(', ', $frame['args']) . ')' . PHP_EOL; | 
                                                        |
| 235 | -		} else { | 
                                                        |
| 236 | -			$message .= get_class($ex) . '("' . $ex->getMessage() . '")' . PHP_EOL; | 
                                                        |
| 237 | - }  | 
                                                        |
| 238 | - }  | 
                                                        |
| 239 | -  | 
                                                        |
| 240 | -	if (error_reporting() & $ex->getCode()) { | 
                                                        |
| 241 | - echo $message;  | 
                                                        |
| 242 | - }  | 
                                                        |
| 243 | -  | 
                                                        |
| 244 | - Log::addErrorLog($message);  | 
                                                        |
| 200 | + $message = $ex->getFile() . ':' . $ex->getLine() . ' ' . $ex->getMessage() . PHP_EOL;  | 
                                                        |
| 201 | +  | 
                                                        |
| 202 | +    foreach ($ex->getTrace() as $level => $frame) { | 
                                                        |
| 203 | +        $frame += array('args' => array(), 'file' => 'unknown', 'line' => 'unknown'); | 
                                                        |
| 204 | +        array_walk($frame['args'], function (&$arg) { | 
                                                        |
| 205 | +            switch (gettype($arg)) { | 
                                                        |
| 206 | + case 'boolean':  | 
                                                        |
| 207 | + case 'integer':  | 
                                                        |
| 208 | + case 'double':  | 
                                                        |
| 209 | + case 'null':  | 
                                                        |
| 210 | + $arg = var_export($arg, true);  | 
                                                        |
| 211 | + break;  | 
                                                        |
| 212 | + case 'string':  | 
                                                        |
| 213 | +                if (mb_strlen($arg) > 30) { | 
                                                        |
| 214 | + $arg = substr($arg, 0, 30) . '…';  | 
                                                        |
| 215 | + }  | 
                                                        |
| 216 | + $arg = var_export($arg, true);  | 
                                                        |
| 217 | + break;  | 
                                                        |
| 218 | + case 'object':  | 
                                                        |
| 219 | + $reflection = new \ReflectionClass($arg);  | 
                                                        |
| 220 | +                if (is_object($arg) && method_exists($arg, '__toString')) { | 
                                                        |
| 221 | + $arg = '[' . $reflection->getShortName() . ' ' . (string) $arg . ']';  | 
                                                        |
| 222 | +                } else { | 
                                                        |
| 223 | + $arg = '[' . $reflection->getShortName() . ']';  | 
                                                        |
| 224 | + }  | 
                                                        |
| 225 | + break;  | 
                                                        |
| 226 | + default:  | 
                                                        |
| 227 | + $arg = '[' . gettype($arg) . ']';  | 
                                                        |
| 228 | + break;  | 
                                                        |
| 229 | + }  | 
                                                        |
| 230 | + });  | 
                                                        |
| 231 | + $frame['file'] = str_replace(dirname(__DIR__), '', $frame['file']);  | 
                                                        |
| 232 | + $message .= '#' . $level . ' ' . $frame['file'] . ':' . $frame['line'] . ' ';  | 
                                                        |
| 233 | +        if ($level) { | 
                                                        |
| 234 | +            $message .= $frame['function'] . '(' . implode(', ', $frame['args']) . ')' . PHP_EOL; | 
                                                        |
| 235 | +        } else { | 
                                                        |
| 236 | +            $message .= get_class($ex) . '("' . $ex->getMessage() . '")' . PHP_EOL; | 
                                                        |
| 237 | + }  | 
                                                        |
| 238 | + }  | 
                                                        |
| 239 | +  | 
                                                        |
| 240 | +    if (error_reporting() & $ex->getCode()) { | 
                                                        |
| 241 | + echo $message;  | 
                                                        |
| 242 | + }  | 
                                                        |
| 243 | +  | 
                                                        |
| 244 | + Log::addErrorLog($message);  | 
                                                        |
| 245 | 245 | });  | 
                                                        
| 246 | 246 | |
| 247 | 247 | // Load our configuration file, so we can connect to the database  | 
                                                        
| 248 | 248 |  if (file_exists(WT_ROOT . 'data/config.ini.php')) { | 
                                                        
| 249 | - $dbconfig = parse_ini_file(WT_ROOT . 'data/config.ini.php');  | 
                                                        |
| 250 | - // Invalid/unreadable config file?  | 
                                                        |
| 251 | -	if (!is_array($dbconfig)) { | 
                                                        |
| 252 | -		header('Location: ' . WT_BASE_URL . 'site-unavailable.php'); | 
                                                        |
| 253 | - exit;  | 
                                                        |
| 254 | - }  | 
                                                        |
| 255 | - // Down for maintenance?  | 
                                                        |
| 256 | -	if (file_exists(WT_ROOT . 'data/offline.txt')) { | 
                                                        |
| 257 | -		header('Location: ' . WT_BASE_URL . 'site-offline.php'); | 
                                                        |
| 258 | - exit;  | 
                                                        |
| 259 | - }  | 
                                                        |
| 249 | + $dbconfig = parse_ini_file(WT_ROOT . 'data/config.ini.php');  | 
                                                        |
| 250 | + // Invalid/unreadable config file?  | 
                                                        |
| 251 | +    if (!is_array($dbconfig)) { | 
                                                        |
| 252 | +        header('Location: ' . WT_BASE_URL . 'site-unavailable.php'); | 
                                                        |
| 253 | + exit;  | 
                                                        |
| 254 | + }  | 
                                                        |
| 255 | + // Down for maintenance?  | 
                                                        |
| 256 | +    if (file_exists(WT_ROOT . 'data/offline.txt')) { | 
                                                        |
| 257 | +        header('Location: ' . WT_BASE_URL . 'site-offline.php'); | 
                                                        |
| 258 | + exit;  | 
                                                        |
| 259 | + }  | 
                                                        |
| 260 | 260 |  } else { | 
                                                        
| 261 | - // No config file. Set one up.  | 
                                                        |
| 262 | -	header('Location: ' . WT_BASE_URL . 'setup.php'); | 
                                                        |
| 263 | - exit;  | 
                                                        |
| 261 | + // No config file. Set one up.  | 
                                                        |
| 262 | +    header('Location: ' . WT_BASE_URL . 'setup.php'); | 
                                                        |
| 263 | + exit;  | 
                                                        |
| 264 | 264 | }  | 
                                                        
| 265 | 265 | |
| 266 | 266 | // What is the remote client's IP address  | 
                                                        
| 267 | 267 |  if (Filter::server('HTTP_CLIENT_IP') !== null) { | 
                                                        
| 268 | -	define('WT_CLIENT_IP', Filter::server('HTTP_CLIENT_IP')); | 
                                                        |
| 268 | +    define('WT_CLIENT_IP', Filter::server('HTTP_CLIENT_IP')); | 
                                                        |
| 269 | 269 |  } elseif (Filter::server('HTTP_X_FORWARDED_FOR') !== null) { | 
                                                        
| 270 | -	define('WT_CLIENT_IP', Filter::server('HTTP_X_FORWARDED_FOR')); | 
                                                        |
| 270 | +    define('WT_CLIENT_IP', Filter::server('HTTP_X_FORWARDED_FOR')); | 
                                                        |
| 271 | 271 |  } else { | 
                                                        
| 272 | -	define('WT_CLIENT_IP', Filter::server('REMOTE_ADDR', WT_REGEX_IPV4, '127.0.0.1')); | 
                                                        |
| 272 | +    define('WT_CLIENT_IP', Filter::server('REMOTE_ADDR', WT_REGEX_IPV4, '127.0.0.1')); | 
                                                        |
| 273 | 273 | }  | 
                                                        
| 274 | 274 | |
| 275 | 275 | // Connect to the database  | 
                                                        
| 276 | 276 |  try { | 
                                                        
| 277 | - Database::createInstance($dbconfig['dbhost'], $dbconfig['dbport'], $dbconfig['dbname'], $dbconfig['dbuser'], $dbconfig['dbpass']);  | 
                                                        |
| 278 | -	define('WT_TBLPREFIX', $dbconfig['tblpfx']); | 
                                                        |
| 279 | - unset($dbconfig);  | 
                                                        |
| 280 | - // Some of the FAMILY JOIN HUSBAND JOIN WIFE queries can excede the MAX_JOIN_SIZE setting  | 
                                                        |
| 281 | -	Database::exec("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci', SQL_BIG_SELECTS=1"); | 
                                                        |
| 282 | - // Update the database schema  | 
                                                        |
| 283 | -	$updated = Database::updateSchema('\Fisharebest\Webtrees\Schema', 'WT_SCHEMA_VERSION', WT_SCHEMA_VERSION); | 
                                                        |
| 284 | -	if ($updated) { | 
                                                        |
| 285 | - // updateSchema() might load custom modules - which we cannot load again.  | 
                                                        |
| 286 | -		header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '')); | 
                                                        |
| 287 | - exit;  | 
                                                        |
| 288 | - }  | 
                                                        |
| 277 | + Database::createInstance($dbconfig['dbhost'], $dbconfig['dbport'], $dbconfig['dbname'], $dbconfig['dbuser'], $dbconfig['dbpass']);  | 
                                                        |
| 278 | +    define('WT_TBLPREFIX', $dbconfig['tblpfx']); | 
                                                        |
| 279 | + unset($dbconfig);  | 
                                                        |
| 280 | + // Some of the FAMILY JOIN HUSBAND JOIN WIFE queries can excede the MAX_JOIN_SIZE setting  | 
                                                        |
| 281 | +    Database::exec("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci', SQL_BIG_SELECTS=1"); | 
                                                        |
| 282 | + // Update the database schema  | 
                                                        |
| 283 | +    $updated = Database::updateSchema('\Fisharebest\Webtrees\Schema', 'WT_SCHEMA_VERSION', WT_SCHEMA_VERSION); | 
                                                        |
| 284 | +    if ($updated) { | 
                                                        |
| 285 | + // updateSchema() might load custom modules - which we cannot load again.  | 
                                                        |
| 286 | +        header('Location: ' . WT_BASE_URL . WT_SCRIPT_NAME . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '')); | 
                                                        |
| 287 | + exit;  | 
                                                        |
| 288 | + }  | 
                                                        |
| 289 | 289 |  } catch (PDOException $ex) { | 
                                                        
| 290 | -	header('Location: ' . WT_BASE_URL . 'site-unavailable.php?message=' . rawurlencode($ex->getMessage())); | 
                                                        |
| 291 | - exit;  | 
                                                        |
| 290 | +    header('Location: ' . WT_BASE_URL . 'site-unavailable.php?message=' . rawurlencode($ex->getMessage())); | 
                                                        |
| 291 | + exit;  | 
                                                        |
| 292 | 292 | }  | 
                                                        
| 293 | 293 | |
| 294 | 294 | // The config.ini.php file must always be in a fixed location.  | 
                                                        
@@ -298,120 +298,120 @@ discard block  | 
                                                    ||
| 298 | 298 | // If we have a preferred URL (e.g. www.example.com instead of www.isp.com/~example), then redirect to it.  | 
                                                        
| 299 | 299 |  $SERVER_URL = Site::getPreference('SERVER_URL'); | 
                                                        
| 300 | 300 |  if ($SERVER_URL && $SERVER_URL != WT_BASE_URL) { | 
                                                        
| 301 | -	header('Location: ' . $SERVER_URL . WT_SCRIPT_NAME . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : ''), true, 301); | 
                                                        |
| 302 | - exit;  | 
                                                        |
| 301 | +    header('Location: ' . $SERVER_URL . WT_SCRIPT_NAME . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : ''), true, 301); | 
                                                        |
| 302 | + exit;  | 
                                                        |
| 303 | 303 | }  | 
                                                        
| 304 | 304 | |
| 305 | 305 | // Request more resources - if we can/want to  | 
                                                        
| 306 | 306 |  if (!ini_get('safe_mode')) { | 
                                                        
| 307 | -	$memory_limit = Site::getPreference('MEMORY_LIMIT'); | 
                                                        |
| 308 | -	if ($memory_limit && strpos(ini_get('disable_functions'), 'ini_set') === false) { | 
                                                        |
| 309 | -		ini_set('memory_limit', $memory_limit); | 
                                                        |
| 310 | - }  | 
                                                        |
| 311 | -	$max_execution_time = Site::getPreference('MAX_EXECUTION_TIME'); | 
                                                        |
| 312 | -	if ($max_execution_time && strpos(ini_get('disable_functions'), 'set_time_limit') === false) { | 
                                                        |
| 313 | - set_time_limit($max_execution_time);  | 
                                                        |
| 314 | - }  | 
                                                        |
| 307 | +    $memory_limit = Site::getPreference('MEMORY_LIMIT'); | 
                                                        |
| 308 | +    if ($memory_limit && strpos(ini_get('disable_functions'), 'ini_set') === false) { | 
                                                        |
| 309 | +        ini_set('memory_limit', $memory_limit); | 
                                                        |
| 310 | + }  | 
                                                        |
| 311 | +    $max_execution_time = Site::getPreference('MAX_EXECUTION_TIME'); | 
                                                        |
| 312 | +    if ($max_execution_time && strpos(ini_get('disable_functions'), 'set_time_limit') === false) { | 
                                                        |
| 313 | + set_time_limit($max_execution_time);  | 
                                                        |
| 314 | + }  | 
                                                        |
| 315 | 315 | }  | 
                                                        
| 316 | 316 | |
| 317 | 317 | $rule = Database::prepare(  | 
                                                        
| 318 | - "SELECT rule FROM `##site_access_rule`" .  | 
                                                        |
| 319 | - " WHERE IFNULL(INET_ATON(?), 0) BETWEEN ip_address_start AND ip_address_end" .  | 
                                                        |
| 320 | - " AND ? LIKE user_agent_pattern" .  | 
                                                        |
| 321 | - " ORDER BY ip_address_end LIMIT 1"  | 
                                                        |
| 318 | + "SELECT rule FROM `##site_access_rule`" .  | 
                                                        |
| 319 | + " WHERE IFNULL(INET_ATON(?), 0) BETWEEN ip_address_start AND ip_address_end" .  | 
                                                        |
| 320 | + " AND ? LIKE user_agent_pattern" .  | 
                                                        |
| 321 | + " ORDER BY ip_address_end LIMIT 1"  | 
                                                        |
| 322 | 322 |  )->execute(array(WT_CLIENT_IP, Filter::server('HTTP_USER_AGENT', null, '')))->fetchOne(); | 
                                                        
| 323 | 323 | |
| 324 | 324 |  switch ($rule) { | 
                                                        
| 325 | 325 | case 'allow':  | 
                                                        
| 326 | - $SEARCH_SPIDER = false;  | 
                                                        |
| 327 | - break;  | 
                                                        |
| 326 | + $SEARCH_SPIDER = false;  | 
                                                        |
| 327 | + break;  | 
                                                        |
| 328 | 328 | case 'deny':  | 
                                                        
| 329 | - http_response_code(403);  | 
                                                        |
| 330 | - exit;  | 
                                                        |
| 329 | + http_response_code(403);  | 
                                                        |
| 330 | + exit;  | 
                                                        |
| 331 | 331 | case 'robot':  | 
                                                        
| 332 | 332 | case 'unknown':  | 
                                                        
| 333 | - // Search engines don’t send cookies, and so create a new session with every visit.  | 
                                                        |
| 334 | - // Make sure they always use the same one  | 
                                                        |
| 335 | -	Session::setId('search-engine-' . str_replace('.', '-', WT_CLIENT_IP)); | 
                                                        |
| 336 | - $SEARCH_SPIDER = true;  | 
                                                        |
| 337 | - break;  | 
                                                        |
| 333 | + // Search engines don’t send cookies, and so create a new session with every visit.  | 
                                                        |
| 334 | + // Make sure they always use the same one  | 
                                                        |
| 335 | +    Session::setId('search-engine-' . str_replace('.', '-', WT_CLIENT_IP)); | 
                                                        |
| 336 | + $SEARCH_SPIDER = true;  | 
                                                        |
| 337 | + break;  | 
                                                        |
| 338 | 338 | case '':  | 
                                                        
| 339 | - Database::prepare(  | 
                                                        |
| 340 | - "INSERT INTO `##site_access_rule` (ip_address_start, ip_address_end, user_agent_pattern, comment) VALUES (IFNULL(INET_ATON(?), 0), IFNULL(INET_ATON(?), 4294967295), ?, '')"  | 
                                                        |
| 341 | -	)->execute(array(WT_CLIENT_IP, WT_CLIENT_IP, Filter::server('HTTP_USER_AGENT', null, ''))); | 
                                                        |
| 342 | - $SEARCH_SPIDER = true;  | 
                                                        |
| 343 | - break;  | 
                                                        |
| 339 | + Database::prepare(  | 
                                                        |
| 340 | + "INSERT INTO `##site_access_rule` (ip_address_start, ip_address_end, user_agent_pattern, comment) VALUES (IFNULL(INET_ATON(?), 0), IFNULL(INET_ATON(?), 4294967295), ?, '')"  | 
                                                        |
| 341 | +    )->execute(array(WT_CLIENT_IP, WT_CLIENT_IP, Filter::server('HTTP_USER_AGENT', null, ''))); | 
                                                        |
| 342 | + $SEARCH_SPIDER = true;  | 
                                                        |
| 343 | + break;  | 
                                                        |
| 344 | 344 | }  | 
                                                        
| 345 | 345 | |
| 346 | 346 | // Store our session data in the database.  | 
                                                        
| 347 | 347 | session_set_save_handler(  | 
                                                        
| 348 | - // open  | 
                                                        |
| 349 | -	function () { | 
                                                        |
| 350 | - return true;  | 
                                                        |
| 351 | - },  | 
                                                        |
| 352 | - // close  | 
                                                        |
| 353 | -	function () { | 
                                                        |
| 354 | - return true;  | 
                                                        |
| 355 | - },  | 
                                                        |
| 356 | - // read  | 
                                                        |
| 357 | -	function ($id) { | 
                                                        |
| 358 | -		return (string) Database::prepare("SELECT session_data FROM `##session` WHERE session_id=?")->execute(array($id))->fetchOne(); | 
                                                        |
| 359 | - },  | 
                                                        |
| 360 | - // write  | 
                                                        |
| 361 | -	function ($id, $data) { | 
                                                        |
| 362 | - // Only update the session table once per minute, unless the session data has actually changed.  | 
                                                        |
| 363 | - Database::prepare(  | 
                                                        |
| 364 | - "INSERT INTO `##session` (session_id, user_id, ip_address, session_data, session_time)" .  | 
                                                        |
| 365 | - " VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP - SECOND(CURRENT_TIMESTAMP))" .  | 
                                                        |
| 366 | - " ON DUPLICATE KEY UPDATE" .  | 
                                                        |
| 367 | - " user_id = VALUES(user_id)," .  | 
                                                        |
| 368 | - " ip_address = VALUES(ip_address)," .  | 
                                                        |
| 369 | - " session_data = VALUES(session_data)," .  | 
                                                        |
| 370 | - " session_time = CURRENT_TIMESTAMP - SECOND(CURRENT_TIMESTAMP)"  | 
                                                        |
| 371 | - )->execute(array($id, (int) Auth::id(), WT_CLIENT_IP, $data));  | 
                                                        |
| 372 | -  | 
                                                        |
| 373 | - return true;  | 
                                                        |
| 374 | - },  | 
                                                        |
| 375 | - // destroy  | 
                                                        |
| 376 | -	function ($id) { | 
                                                        |
| 377 | -		Database::prepare("DELETE FROM `##session` WHERE session_id=?")->execute(array($id)); | 
                                                        |
| 378 | -  | 
                                                        |
| 379 | - return true;  | 
                                                        |
| 380 | - },  | 
                                                        |
| 381 | - // gc  | 
                                                        |
| 382 | -	function ($maxlifetime) { | 
                                                        |
| 383 | -		Database::prepare("DELETE FROM `##session` WHERE session_time < DATE_SUB(NOW(), INTERVAL ? SECOND)")->execute(array($maxlifetime)); | 
                                                        |
| 384 | -  | 
                                                        |
| 385 | - return true;  | 
                                                        |
| 386 | - }  | 
                                                        |
| 348 | + // open  | 
                                                        |
| 349 | +    function () { | 
                                                        |
| 350 | + return true;  | 
                                                        |
| 351 | + },  | 
                                                        |
| 352 | + // close  | 
                                                        |
| 353 | +    function () { | 
                                                        |
| 354 | + return true;  | 
                                                        |
| 355 | + },  | 
                                                        |
| 356 | + // read  | 
                                                        |
| 357 | +    function ($id) { | 
                                                        |
| 358 | +        return (string) Database::prepare("SELECT session_data FROM `##session` WHERE session_id=?")->execute(array($id))->fetchOne(); | 
                                                        |
| 359 | + },  | 
                                                        |
| 360 | + // write  | 
                                                        |
| 361 | +    function ($id, $data) { | 
                                                        |
| 362 | + // Only update the session table once per minute, unless the session data has actually changed.  | 
                                                        |
| 363 | + Database::prepare(  | 
                                                        |
| 364 | + "INSERT INTO `##session` (session_id, user_id, ip_address, session_data, session_time)" .  | 
                                                        |
| 365 | + " VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP - SECOND(CURRENT_TIMESTAMP))" .  | 
                                                        |
| 366 | + " ON DUPLICATE KEY UPDATE" .  | 
                                                        |
| 367 | + " user_id = VALUES(user_id)," .  | 
                                                        |
| 368 | + " ip_address = VALUES(ip_address)," .  | 
                                                        |
| 369 | + " session_data = VALUES(session_data)," .  | 
                                                        |
| 370 | + " session_time = CURRENT_TIMESTAMP - SECOND(CURRENT_TIMESTAMP)"  | 
                                                        |
| 371 | + )->execute(array($id, (int) Auth::id(), WT_CLIENT_IP, $data));  | 
                                                        |
| 372 | +  | 
                                                        |
| 373 | + return true;  | 
                                                        |
| 374 | + },  | 
                                                        |
| 375 | + // destroy  | 
                                                        |
| 376 | +    function ($id) { | 
                                                        |
| 377 | +        Database::prepare("DELETE FROM `##session` WHERE session_id=?")->execute(array($id)); | 
                                                        |
| 378 | +  | 
                                                        |
| 379 | + return true;  | 
                                                        |
| 380 | + },  | 
                                                        |
| 381 | + // gc  | 
                                                        |
| 382 | +    function ($maxlifetime) { | 
                                                        |
| 383 | +        Database::prepare("DELETE FROM `##session` WHERE session_time < DATE_SUB(NOW(), INTERVAL ? SECOND)")->execute(array($maxlifetime)); | 
                                                        |
| 384 | +  | 
                                                        |
| 385 | + return true;  | 
                                                        |
| 386 | + }  | 
                                                        |
| 387 | 387 | );  | 
                                                        
| 388 | 388 | |
| 389 | 389 | Session::start(array(  | 
                                                        
| 390 | -	'gc_maxlifetime' => Site::getPreference('SESSION_TIME'), | 
                                                        |
| 391 | -	'cookie_path'    => implode('/', array_map('rawurlencode', explode('/', parse_url(WT_BASE_URL, PHP_URL_PATH)))), | 
                                                        |
| 390 | +    'gc_maxlifetime' => Site::getPreference('SESSION_TIME'), | 
                                                        |
| 391 | +    'cookie_path'    => implode('/', array_map('rawurlencode', explode('/', parse_url(WT_BASE_URL, PHP_URL_PATH)))), | 
                                                        |
| 392 | 392 | ));  | 
                                                        
| 393 | 393 | |
| 394 | 394 |  if (!Auth::isSearchEngine() && !Session::get('initiated')) { | 
                                                        
| 395 | - // A new session, so prevent session fixation attacks by choosing a new PHPSESSID.  | 
                                                        |
| 396 | - Session::regenerate(true);  | 
                                                        |
| 397 | -	Session::put('initiated', true); | 
                                                        |
| 395 | + // A new session, so prevent session fixation attacks by choosing a new PHPSESSID.  | 
                                                        |
| 396 | + Session::regenerate(true);  | 
                                                        |
| 397 | +    Session::put('initiated', true); | 
                                                        |
| 398 | 398 |  } else { | 
                                                        
| 399 | - // An existing session  | 
                                                        |
| 399 | + // An existing session  | 
                                                        |
| 400 | 400 | }  | 
                                                        
| 401 | 401 | |
| 402 | 402 | // Set the tree for the page; (1) the request, (2) the session, (3) the site default, (4) any tree  | 
                                                        
| 403 | 403 |  foreach (array(Filter::post('ged'), Filter::get('ged'), Session::get('GEDCOM'), Site::getPreference('DEFAULT_GEDCOM')) as $tree_name) { | 
                                                        
| 404 | - $WT_TREE = Tree::findByName($tree_name);  | 
                                                        |
| 405 | -	if ($WT_TREE) { | 
                                                        |
| 406 | -		Session::put('GEDCOM', $tree_name); | 
                                                        |
| 407 | - break;  | 
                                                        |
| 408 | - }  | 
                                                        |
| 404 | + $WT_TREE = Tree::findByName($tree_name);  | 
                                                        |
| 405 | +    if ($WT_TREE) { | 
                                                        |
| 406 | +        Session::put('GEDCOM', $tree_name); | 
                                                        |
| 407 | + break;  | 
                                                        |
| 408 | + }  | 
                                                        |
| 409 | 409 | }  | 
                                                        
| 410 | 410 | // No chosen tree? Use any one.  | 
                                                        
| 411 | 411 |  if (!$WT_TREE) { | 
                                                        
| 412 | -	foreach (Tree::getAll() as $WT_TREE) { | 
                                                        |
| 413 | - break;  | 
                                                        |
| 414 | - }  | 
                                                        |
| 412 | +    foreach (Tree::getAll() as $WT_TREE) { | 
                                                        |
| 413 | + break;  | 
                                                        |
| 414 | + }  | 
                                                        |
| 415 | 415 | }  | 
                                                        
| 416 | 416 | |
| 417 | 417 | // With no parameters, init() looks to the environment to choose a language  | 
                                                        
@@ -423,9 +423,9 @@ discard block  | 
                                                    ||
| 423 | 423 | |
| 424 | 424 | // Users get their own time-zone. Visitors get the site time-zone.  | 
                                                        
| 425 | 425 |  if (Auth::check()) { | 
                                                        
| 426 | -	date_default_timezone_set(Auth::user()->getPreference('TIMEZONE', 'UTC')); | 
                                                        |
| 426 | +    date_default_timezone_set(Auth::user()->getPreference('TIMEZONE', 'UTC')); | 
                                                        |
| 427 | 427 |  } else { | 
                                                        
| 428 | -	date_default_timezone_set(Site::getPreference('TIMEZONE') ?: 'UTC'); | 
                                                        |
| 428 | +    date_default_timezone_set(Site::getPreference('TIMEZONE') ?: 'UTC'); | 
                                                        |
| 429 | 429 | }  | 
                                                        
| 430 | 430 |  define('WT_TIMESTAMP_OFFSET', date_offset_get(new \DateTime('now'))); | 
                                                        
| 431 | 431 | |
@@ -433,79 +433,79 @@ discard block  | 
                                                    ||
| 433 | 433 | |
| 434 | 434 | // The login URL must be an absolute URL, and can be user-defined  | 
                                                        
| 435 | 435 |  if (Site::getPreference('LOGIN_URL')) { | 
                                                        
| 436 | -	define('WT_LOGIN_URL', Site::getPreference('LOGIN_URL')); | 
                                                        |
| 436 | +    define('WT_LOGIN_URL', Site::getPreference('LOGIN_URL')); | 
                                                        |
| 437 | 437 |  } else { | 
                                                        
| 438 | -	define('WT_LOGIN_URL', WT_BASE_URL . 'login.php'); | 
                                                        |
| 438 | +    define('WT_LOGIN_URL', WT_BASE_URL . 'login.php'); | 
                                                        |
| 439 | 439 | }  | 
                                                        
| 440 | 440 | |
| 441 | 441 | // If there is no current tree and we need one, then redirect somewhere  | 
                                                        
| 442 | 442 |  if (WT_SCRIPT_NAME != 'admin_trees_manage.php' && WT_SCRIPT_NAME != 'admin_pgv_to_wt.php' && WT_SCRIPT_NAME != 'login.php' && WT_SCRIPT_NAME != 'logout.php' && WT_SCRIPT_NAME != 'import.php' && WT_SCRIPT_NAME != 'help_text.php' && WT_SCRIPT_NAME != 'message.php' && WT_SCRIPT_NAME != 'action.php') { | 
                                                        
| 443 | -	if (!$WT_TREE || !$WT_TREE->getPreference('imported')) { | 
                                                        |
| 444 | -		if (Auth::isAdmin()) { | 
                                                        |
| 445 | -			header('Location: ' . WT_BASE_URL . 'admin_trees_manage.php'); | 
                                                        |
| 446 | -		} else { | 
                                                        |
| 447 | - // We're not an administrator, so we can only log in if there is a tree.  | 
                                                        |
| 448 | -			if (Auth::id()) { | 
                                                        |
| 449 | - Auth::logout();  | 
                                                        |
| 450 | - FlashMessages::addMessage(  | 
                                                        |
| 451 | -					I18N::translate('This user account does not have access to any tree.') | 
                                                        |
| 452 | - );  | 
                                                        |
| 453 | - }  | 
                                                        |
| 454 | -			header('Location: ' . WT_LOGIN_URL . '?url=' . rawurlencode(WT_SCRIPT_NAME . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '')), true, 301); | 
                                                        |
| 455 | -  | 
                                                        |
| 456 | - }  | 
                                                        |
| 457 | - exit;  | 
                                                        |
| 458 | - }  | 
                                                        |
| 443 | +    if (!$WT_TREE || !$WT_TREE->getPreference('imported')) { | 
                                                        |
| 444 | +        if (Auth::isAdmin()) { | 
                                                        |
| 445 | +            header('Location: ' . WT_BASE_URL . 'admin_trees_manage.php'); | 
                                                        |
| 446 | +        } else { | 
                                                        |
| 447 | + // We're not an administrator, so we can only log in if there is a tree.  | 
                                                        |
| 448 | +            if (Auth::id()) { | 
                                                        |
| 449 | + Auth::logout();  | 
                                                        |
| 450 | + FlashMessages::addMessage(  | 
                                                        |
| 451 | +                    I18N::translate('This user account does not have access to any tree.') | 
                                                        |
| 452 | + );  | 
                                                        |
| 453 | + }  | 
                                                        |
| 454 | +            header('Location: ' . WT_LOGIN_URL . '?url=' . rawurlencode(WT_SCRIPT_NAME . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '')), true, 301); | 
                                                        |
| 455 | +  | 
                                                        |
| 456 | + }  | 
                                                        |
| 457 | + exit;  | 
                                                        |
| 458 | + }  | 
                                                        |
| 459 | 459 | }  | 
                                                        
| 460 | 460 | |
| 461 | 461 | // Update the last-login time no more than once a minute  | 
                                                        
| 462 | 462 |  if (WT_TIMESTAMP - Session::get('activity_time') >= 60) { | 
                                                        
| 463 | -	if (Session::get('masquerade') === null) { | 
                                                        |
| 464 | -		Auth::user()->setPreference('sessiontime', WT_TIMESTAMP); | 
                                                        |
| 465 | - }  | 
                                                        |
| 466 | -	Session::put('activity_time', WT_TIMESTAMP); | 
                                                        |
| 463 | +    if (Session::get('masquerade') === null) { | 
                                                        |
| 464 | +        Auth::user()->setPreference('sessiontime', WT_TIMESTAMP); | 
                                                        |
| 465 | + }  | 
                                                        |
| 466 | +    Session::put('activity_time', WT_TIMESTAMP); | 
                                                        |
| 467 | 467 | }  | 
                                                        
| 468 | 468 | |
| 469 | 469 | // Set the theme  | 
                                                        
| 470 | 470 |  if (substr(WT_SCRIPT_NAME, 0, 5) === 'admin' || WT_SCRIPT_NAME === 'module.php' && substr(Filter::get('mod_action'), 0, 5) === 'admin') { | 
                                                        
| 471 | - // Administration scripts begin with “admin” and use a special administration theme  | 
                                                        |
| 472 | - Theme::theme(new AdministrationTheme)->init($WT_TREE);  | 
                                                        |
| 471 | + // Administration scripts begin with “admin” and use a special administration theme  | 
                                                        |
| 472 | + Theme::theme(new AdministrationTheme)->init($WT_TREE);  | 
                                                        |
| 473 | 473 |  } else { | 
                                                        
| 474 | - // Last theme used?  | 
                                                        |
| 475 | -	$theme_id = Session::get('theme_id'); | 
                                                        |
| 476 | - // Default for tree  | 
                                                        |
| 477 | -	if (!array_key_exists($theme_id, Theme::themeNames()) && $WT_TREE) { | 
                                                        |
| 478 | -		$theme_id = $WT_TREE->getPreference('THEME_DIR'); | 
                                                        |
| 479 | - }  | 
                                                        |
| 480 | - // Default for site  | 
                                                        |
| 481 | -	if (!array_key_exists($theme_id, Theme::themeNames())) { | 
                                                        |
| 482 | -		$theme_id = Site::getPreference('THEME_DIR'); | 
                                                        |
| 483 | - }  | 
                                                        |
| 484 | - // Default  | 
                                                        |
| 485 | -	if (!array_key_exists($theme_id, Theme::themeNames())) { | 
                                                        |
| 486 | - $theme_id = 'webtrees';  | 
                                                        |
| 487 | - }  | 
                                                        |
| 488 | -	foreach (Theme::installedThemes() as $theme) { | 
                                                        |
| 489 | -		if ($theme->themeId() === $theme_id) { | 
                                                        |
| 490 | - Theme::theme($theme)->init($WT_TREE);  | 
                                                        |
| 491 | - // Remember this setting  | 
                                                        |
| 492 | -			if (Site::getPreference('ALLOW_USER_THEMES')) { | 
                                                        |
| 493 | -				Session::put('theme_id', $theme_id); | 
                                                        |
| 494 | - }  | 
                                                        |
| 495 | - break;  | 
                                                        |
| 496 | - }  | 
                                                        |
| 497 | - }  | 
                                                        |
| 474 | + // Last theme used?  | 
                                                        |
| 475 | +    $theme_id = Session::get('theme_id'); | 
                                                        |
| 476 | + // Default for tree  | 
                                                        |
| 477 | +    if (!array_key_exists($theme_id, Theme::themeNames()) && $WT_TREE) { | 
                                                        |
| 478 | +        $theme_id = $WT_TREE->getPreference('THEME_DIR'); | 
                                                        |
| 479 | + }  | 
                                                        |
| 480 | + // Default for site  | 
                                                        |
| 481 | +    if (!array_key_exists($theme_id, Theme::themeNames())) { | 
                                                        |
| 482 | +        $theme_id = Site::getPreference('THEME_DIR'); | 
                                                        |
| 483 | + }  | 
                                                        |
| 484 | + // Default  | 
                                                        |
| 485 | +    if (!array_key_exists($theme_id, Theme::themeNames())) { | 
                                                        |
| 486 | + $theme_id = 'webtrees';  | 
                                                        |
| 487 | + }  | 
                                                        |
| 488 | +    foreach (Theme::installedThemes() as $theme) { | 
                                                        |
| 489 | +        if ($theme->themeId() === $theme_id) { | 
                                                        |
| 490 | + Theme::theme($theme)->init($WT_TREE);  | 
                                                        |
| 491 | + // Remember this setting  | 
                                                        |
| 492 | +            if (Site::getPreference('ALLOW_USER_THEMES')) { | 
                                                        |
| 493 | +                Session::put('theme_id', $theme_id); | 
                                                        |
| 494 | + }  | 
                                                        |
| 495 | + break;  | 
                                                        |
| 496 | + }  | 
                                                        |
| 497 | + }  | 
                                                        |
| 498 | 498 | }  | 
                                                        
| 499 | 499 | |
| 500 | 500 | // Search engines are only allowed to see certain pages.  | 
                                                        
| 501 | 501 | if (Auth::isSearchEngine() && !in_array(WT_SCRIPT_NAME, array(  | 
                                                        
| 502 | - 'index.php', 'indilist.php', 'module.php', 'mediafirewall.php',  | 
                                                        |
| 503 | - 'individual.php', 'family.php', 'mediaviewer.php', 'note.php', 'repo.php', 'source.php',  | 
                                                        |
| 502 | + 'index.php', 'indilist.php', 'module.php', 'mediafirewall.php',  | 
                                                        |
| 503 | + 'individual.php', 'family.php', 'mediaviewer.php', 'note.php', 'repo.php', 'source.php',  | 
                                                        |
| 504 | 504 |  ))) { | 
                                                        
| 505 | - http_response_code(403);  | 
                                                        |
| 506 | - $controller = new PageController;  | 
                                                        |
| 507 | -	$controller->setPageTitle(I18N::translate('Search engine')); | 
                                                        |
| 508 | - $controller->pageHeader();  | 
                                                        |
| 509 | -	echo '<p class="ui-state-error">', I18N::translate('You do not have permission to view this page.'), '</p>'; | 
                                                        |
| 510 | - exit;  | 
                                                        |
| 505 | + http_response_code(403);  | 
                                                        |
| 506 | + $controller = new PageController;  | 
                                                        |
| 507 | +    $controller->setPageTitle(I18N::translate('Search engine')); | 
                                                        |
| 508 | + $controller->pageHeader();  | 
                                                        |
| 509 | +    echo '<p class="ui-state-error">', I18N::translate('You do not have permission to view this page.'), '</p>'; | 
                                                        |
| 510 | + exit;  | 
                                                        |
| 511 | 511 | }  |