Add core/sanitize_php.php
A small number of PHP-sanity things (eg don't silently ignore errors) to be included right at the very start of index.php and tests/bootstrap.php
This commit is contained in:
		
							parent
							
								
									eecd35d175
								
							
						
					
					
						commit
						2197b15012
					
				| @ -78,7 +78,10 @@ class Database | |||||||
|         } elseif ($db_proto === DatabaseDriver::SQLITE) { |         } elseif ($db_proto === DatabaseDriver::SQLITE) { | ||||||
|             $this->engine = new SQLite(); |             $this->engine = new SQLite(); | ||||||
|         } else { |         } else { | ||||||
|             die('Unknown PDO driver: '.$db_proto); |             die_nicely( | ||||||
|  |                 'Unknown PDO driver: '.$db_proto, | ||||||
|  |                 "Please check that this is a valid driver, installing the PHP modules if needed" | ||||||
|  |             ); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ function install() | |||||||
|     date_default_timezone_set('UTC'); |     date_default_timezone_set('UTC'); | ||||||
| 
 | 
 | ||||||
|     if (is_readable("data/config/shimmie.conf.php")) { |     if (is_readable("data/config/shimmie.conf.php")) { | ||||||
|         exit_with_page( |         die_nicely( | ||||||
|             "Shimmie is already installed.", |             "Shimmie is already installed.", | ||||||
|             "data/config/shimmie.conf.php exists, how did you get here?" |             "data/config/shimmie.conf.php exists, how did you get here?" | ||||||
|         ); |         ); | ||||||
| @ -69,7 +69,7 @@ function do_install($dsn) | |||||||
|         create_tables(new Database($dsn)); |         create_tables(new Database($dsn)); | ||||||
|         write_config($dsn); |         write_config($dsn); | ||||||
|     } catch (InstallerException $e) { |     } catch (InstallerException $e) { | ||||||
|         exit_with_page($e->title, $e->body, $e->code); |         die_nicely($e->title, $e->body, $e->code); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -117,7 +117,7 @@ function ask_questions() | |||||||
|     $warn_msg = $warnings ? "<h3>Warnings</h3>".implode("\n<p>", $warnings) : ""; |     $warn_msg = $warnings ? "<h3>Warnings</h3>".implode("\n<p>", $warnings) : ""; | ||||||
|     $err_msg = $errors ? "<h3>Errors</h3>".implode("\n<p>", $errors) : ""; |     $err_msg = $errors ? "<h3>Errors</h3>".implode("\n<p>", $errors) : ""; | ||||||
| 
 | 
 | ||||||
|     exit_with_page( |     die_nicely( | ||||||
|         "Install Options", |         "Install Options", | ||||||
|         <<<EOD |         <<<EOD | ||||||
|     $warn_msg |     $warn_msg | ||||||
| @ -304,7 +304,7 @@ function write_config($dsn) | |||||||
| 
 | 
 | ||||||
|     if (file_put_contents("data/config/shimmie.conf.php", $file_content, LOCK_EX)) { |     if (file_put_contents("data/config/shimmie.conf.php", $file_content, LOCK_EX)) { | ||||||
|         header("Location: index.php?flash=Installation%20complete"); |         header("Location: index.php?flash=Installation%20complete"); | ||||||
|         exit_with_page( |         die_nicely( | ||||||
|             "Installation Successful", |             "Installation Successful", | ||||||
|             "<p>If you aren't redirected, <a href=\"index.php\">click here to Continue</a>." |             "<p>If you aren't redirected, <a href=\"index.php\">click here to Continue</a>." | ||||||
|         ); |         ); | ||||||
| @ -324,25 +324,3 @@ function write_config($dsn) | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| function exit_with_page($title, $body, $code=0) |  | ||||||
| { |  | ||||||
|     print("<!DOCTYPE html>
 |  | ||||||
| <html lang='en'> |  | ||||||
| 	<head> |  | ||||||
| 		<title>Shimmie Installer</title> |  | ||||||
| 		<link rel=\"shortcut icon\" href=\"ext/static_files/static/favicon.ico\">
 |  | ||||||
| 		<link rel=\"stylesheet\" href=\"ext/static_files/style.css\" type=\"text/css\">
 |  | ||||||
| 	</head> |  | ||||||
| 	<body> |  | ||||||
| 		<div id=\"installer\">
 |  | ||||||
| 		    <h1>Shimmie Installer</h1> |  | ||||||
| 		    <h3>$title</h3> |  | ||||||
| 			<div class=\"container\">
 |  | ||||||
| 			    $body |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
|     </body> |  | ||||||
| </html>");
 |  | ||||||
|     exit($code); |  | ||||||
| } |  | ||||||
|  | |||||||
							
								
								
									
										63
									
								
								core/sanitize_php.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								core/sanitize_php.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | <?php declare(strict_types=1); | ||||||
|  | /* | ||||||
|  |  * A small number of PHP-sanity things (eg don't silently ignore errors) to | ||||||
|  |  * be included right at the very start of index.php and tests/bootstrap.php | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | $min_php = "7.3"; | ||||||
|  | if (version_compare(phpversion(), $min_php, ">=") === false) { | ||||||
|  |     print " | ||||||
|  | Shimmie does not support versions of PHP lower than $min_php | ||||||
|  | (PHP reports that it is version ".phpversion()."). | ||||||
|  | If your web host is running an older version, they are dangerously out of | ||||||
|  | date and you should plan on moving elsewhere. | ||||||
|  | ";
 | ||||||
|  |     exit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # ini_set('zend.assertions', '1');  // generate assertions
 | ||||||
|  | ini_set('assert.exception', '1');  // throw exceptions when failed
 | ||||||
|  | set_error_handler(function ($errNo, $errStr) { | ||||||
|  |     // Should we turn ALL notices into errors? PHP allows a lot of
 | ||||||
|  |     // terrible things to happen by default...
 | ||||||
|  |     if (strpos($errStr, 'Use of undefined constant ') === 0) { | ||||||
|  |         throw new Exception("PHP Error#$errNo: $errStr"); | ||||||
|  |     } else { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | ob_start(); | ||||||
|  | 
 | ||||||
|  | if (PHP_SAPI === 'cli' || PHP_SAPI == 'phpdbg') { | ||||||
|  |     if (isset($_SERVER['REMOTE_ADDR'])) { | ||||||
|  |         die("CLI with remote addr? Confused, not taking the risk."); | ||||||
|  |     } | ||||||
|  |     $_SERVER['REMOTE_ADDR'] = "0.0.0.0"; | ||||||
|  |     $_SERVER['HTTP_HOST'] = "<cli command>"; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function die_nicely($title, $body, $code=0) | ||||||
|  | { | ||||||
|  |     print("<!DOCTYPE html>
 | ||||||
|  | <html lang='en'> | ||||||
|  | 	<head> | ||||||
|  | 		<title>Shimmie</title> | ||||||
|  | 		<link rel=\"shortcut icon\" href=\"ext/static_files/static/favicon.ico\">
 | ||||||
|  | 		<link rel=\"stylesheet\" href=\"ext/static_files/style.css\" type=\"text/css\">
 | ||||||
|  | 	</head> | ||||||
|  | 	<body> | ||||||
|  | 		<div id=\"installer\">
 | ||||||
|  | 		    <h1>Shimmie</h1> | ||||||
|  | 		    <h3>$title</h3> | ||||||
|  | 			<div class=\"container\">
 | ||||||
|  | 			    $body | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  |     </body> | ||||||
|  | </html>");
 | ||||||
|  |     if ($code != 0) { | ||||||
|  |         http_response_code(500); | ||||||
|  |     } | ||||||
|  |     exit($code); | ||||||
|  | } | ||||||
| @ -554,58 +554,26 @@ function _load_theme_files() | |||||||
|     require_all(_get_themelet_files(get_theme())); |     require_all(_get_themelet_files(get_theme())); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function _sanitise_environment(): void | function _set_up_shimmie_environment(): void | ||||||
| { | { | ||||||
|     global $tracer_enabled; |     global $tracer_enabled; | ||||||
| 
 | 
 | ||||||
|     $min_php = "7.3"; |  | ||||||
|     if (version_compare(phpversion(), $min_php, ">=") === false) { |  | ||||||
|         print " |  | ||||||
| Shimmie does not support versions of PHP lower than $min_php |  | ||||||
| (PHP reports that it is version ".phpversion()."). |  | ||||||
| If your web host is running an older version, they are dangerously out of |  | ||||||
| date and you should plan on moving elsewhere. |  | ||||||
| ";
 |  | ||||||
|         exit; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (file_exists("images") && !file_exists("data/images")) { |     if (file_exists("images") && !file_exists("data/images")) { | ||||||
|         die("As of Shimmie 2.7 images and thumbs should be moved to data/images and data/thumbs"); |         die_nicely("Upgrade error", "As of Shimmie 2.7 images and thumbs should be moved to data/images and data/thumbs"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (TIMEZONE) { |     if (TIMEZONE) { | ||||||
|         date_default_timezone_set(TIMEZONE); |         date_default_timezone_set(TIMEZONE); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     # ini_set('zend.assertions', '1');  // generate assertions
 |  | ||||||
|     ini_set('assert.exception', '1');  // throw exceptions when failed
 |  | ||||||
|     if (DEBUG) { |     if (DEBUG) { | ||||||
|         error_reporting(E_ALL); |         error_reporting(E_ALL); | ||||||
|     } |     } | ||||||
|     set_error_handler(function ($errNo, $errStr) { |  | ||||||
|         // Should we turn ALL notices into errors? PHP allows a lot of
 |  | ||||||
|         // terrible things to happen by default...
 |  | ||||||
|         if (strpos($errStr, 'Use of undefined constant ') === 0) { |  | ||||||
|             throw new Exception("PHP Error#$errNo: $errStr"); |  | ||||||
|         } else { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 | 
 | ||||||
|     // The trace system has a certain amount of memory consumption every time it is used,
 |     // The trace system has a certain amount of memory consumption every time it is used,
 | ||||||
|     // so to prevent running out of memory during complex operations code that uses it should
 |     // so to prevent running out of memory during complex operations code that uses it should
 | ||||||
|     // check if tracer output is enabled before making use of it.
 |     // check if tracer output is enabled before making use of it.
 | ||||||
|     $tracer_enabled = constant('TRACE_FILE')!==null; |     $tracer_enabled = constant('TRACE_FILE')!==null; | ||||||
| 
 |  | ||||||
|     ob_start(); |  | ||||||
| 
 |  | ||||||
|     if (PHP_SAPI === 'cli' || PHP_SAPI == 'phpdbg') { |  | ||||||
|         if (isset($_SERVER['REMOTE_ADDR'])) { |  | ||||||
|             die("CLI with remote addr? Confused, not taking the risk."); |  | ||||||
|         } |  | ||||||
|         $_SERVER['REMOTE_ADDR'] = "0.0.0.0"; |  | ||||||
|         $_SERVER['HTTP_HOST'] = "<cli command>"; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										35
									
								
								index.php
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								index.php
									
									
									
									
									
								
							| @ -3,31 +3,18 @@ | |||||||
| * Make sure that shimmie is correctly installed                             * | * Make sure that shimmie is correctly installed                             * | ||||||
| \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||||||
| 
 | 
 | ||||||
|  | require_once "core/sanitize_php.php"; | ||||||
|  | 
 | ||||||
| if (!file_exists("vendor/")) { | if (!file_exists("vendor/")) { | ||||||
|     $cwd = getcwd(); |     $cwd = getcwd(); | ||||||
|     print <<<EOD |     die_nicely( | ||||||
| <!DOCTYPE html> |         "Shimmie is unable to find the composer <code>vendor</code> directory.", | ||||||
| <html lang="en"> |         " | ||||||
| 	<head> | 			<p>To finish installing, you need to run <code>composer install</code> | ||||||
| 		<title>Shimmie Error</title> | 			in the shimmie directory (<code>$cwd</code>).</p> | ||||||
| 		<link rel="shortcut icon" href="ext/static_files/static/favicon.ico"> | 			<p>(If you don't have composer, <a href='https://getcomposer.org/'>get it here</a>)</p> | ||||||
| 		<link rel="stylesheet" href="ext/static_files/style.css" type="text/css"> | 		" | ||||||
| 	</head> |     ); | ||||||
| 	<body> |  | ||||||
| 		<div id="installer"> |  | ||||||
| 			<h1>Install Error</h1> |  | ||||||
| 			<h3>Shimmie is unable to find the composer <code>vendor</code> directory.</h3> |  | ||||||
| 			<div class="container"> |  | ||||||
| 				<p>To finish installing, you need to run <code>composer install</code> |  | ||||||
| 				in the shimmie directory (<code>$cwd</code>).</p> |  | ||||||
| 				<p>(If you don't have composer, <a href="https://getcomposer.org/">get it here</a>)</p> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	</body> |  | ||||||
| </html> |  | ||||||
| EOD; |  | ||||||
|     http_response_code(500); |  | ||||||
|     exit; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if (!file_exists("data/config/shimmie.conf.php")) { | if (!file_exists("data/config/shimmie.conf.php")) { | ||||||
| @ -50,7 +37,7 @@ require_once "core/polyfills.php"; | |||||||
| require_once "core/util.php"; | require_once "core/util.php"; | ||||||
| 
 | 
 | ||||||
| global $cache, $config, $database, $user, $page, $_tracer; | global $cache, $config, $database, $user, $page, $_tracer; | ||||||
| _sanitise_environment(); | _set_up_shimmie_environment(); | ||||||
| $_tracer = new EventTracer(); | $_tracer = new EventTracer(); | ||||||
| $_tracer->begin("Bootstrap"); | $_tracer->begin("Bootstrap"); | ||||||
| _load_core_files(); | _load_core_files(); | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ | |||||||
| use PHPUnit\Framework\TestCase; | use PHPUnit\Framework\TestCase; | ||||||
| 
 | 
 | ||||||
| chdir(dirname(dirname(__FILE__))); | chdir(dirname(dirname(__FILE__))); | ||||||
|  | require_once "core/sanitize_php.php"; | ||||||
| require_once "vendor/autoload.php"; | require_once "vendor/autoload.php"; | ||||||
| require_once "tests/defines.php"; | require_once "tests/defines.php"; | ||||||
| require_once "core/sys_config.php"; | require_once "core/sys_config.php"; | ||||||
| @ -15,7 +16,7 @@ if (file_exists("tests/trace.json")) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| global $cache, $config, $database, $user, $page, $_tracer; | global $cache, $config, $database, $user, $page, $_tracer; | ||||||
| _sanitise_environment(); | _set_up_shimmie_environment(); | ||||||
| $tracer_enabled = true; | $tracer_enabled = true; | ||||||
| $_tracer = new EventTracer(); | $_tracer = new EventTracer(); | ||||||
| $_tracer->begin("bootstrap"); | $_tracer->begin("bootstrap"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user