move some installer bits to util.php
This commit is contained in:
		
							parent
							
								
									2d20cf388e
								
							
						
					
					
						commit
						9b50e98927
					
				| @ -67,6 +67,7 @@ require_once "core/exceptions.php"; | |||||||
| require_once "core/cacheengine.php"; | require_once "core/cacheengine.php"; | ||||||
| require_once "core/dbengine.php"; | require_once "core/dbengine.php"; | ||||||
| require_once "core/database.php"; | require_once "core/database.php"; | ||||||
|  | require_once "core/util.php"; | ||||||
| 
 | 
 | ||||||
| if (is_readable("data/config/shimmie.conf.php")) { | if (is_readable("data/config/shimmie.conf.php")) { | ||||||
|     die("Shimmie is already installed."); |     die("Shimmie is already installed."); | ||||||
| @ -76,29 +77,6 @@ do_install(); | |||||||
| 
 | 
 | ||||||
| // TODO: Can some of these be pushed into "core/???.inc.php" ?
 | // TODO: Can some of these be pushed into "core/???.inc.php" ?
 | ||||||
| 
 | 
 | ||||||
| function check_gd_version(): int |  | ||||||
| { |  | ||||||
|     $gdversion = 0; |  | ||||||
| 
 |  | ||||||
|     if (function_exists('gd_info')) { |  | ||||||
|         $gd_info = gd_info(); |  | ||||||
|         if (substr_count($gd_info['GD Version'], '2.')) { |  | ||||||
|             $gdversion = 2; |  | ||||||
|         } elseif (substr_count($gd_info['GD Version'], '1.')) { |  | ||||||
|             $gdversion = 1; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     return $gdversion; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function check_im_version(): int |  | ||||||
| { |  | ||||||
|     $convert_check = exec("convert"); |  | ||||||
| 
 |  | ||||||
|     return (empty($convert_check) ? 0 : 1); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function do_install() | function do_install() | ||||||
| { | { | ||||||
|     if (file_exists("data/config/auto_install.conf.php")) { |     if (file_exists("data/config/auto_install.conf.php")) { | ||||||
| @ -115,7 +93,23 @@ function do_install() | |||||||
| 
 | 
 | ||||||
|     define("CACHE_DSN", null); |     define("CACHE_DSN", null); | ||||||
|     define("DATABASE_KA", true); |     define("DATABASE_KA", true); | ||||||
|     install_process(); |     try { | ||||||
|  |         create_dirs(); | ||||||
|  |         create_tables(new Database()); | ||||||
|  |         write_config(); | ||||||
|  |     } catch (InstallerException $e) { | ||||||
|  |         print <<<EOD | ||||||
|  | 		<div id="installer"> | ||||||
|  | 			<h1>Shimmie Installer</h1> | ||||||
|  | 			<h3>{$e->title}</h3> | ||||||
|  | 			<div class="container"> | ||||||
|  | 				{$e->body} | ||||||
|  | 				<br/><br/> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | EOD; | ||||||
|  |         exit($e->code); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function ask_questions() | function ask_questions() | ||||||
| @ -231,208 +225,6 @@ function ask_questions() | |||||||
| 		</div> | 		</div> | ||||||
| EOD; | EOD; | ||||||
| } | } | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * This is where the install really takes place. |  | ||||||
|  */ |  | ||||||
| function install_process() |  | ||||||
| { |  | ||||||
|     build_dirs(); |  | ||||||
|     create_tables(); |  | ||||||
|     insert_defaults(); |  | ||||||
|     write_config(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function create_tables() |  | ||||||
| { |  | ||||||
|     try { |  | ||||||
|         $db = new Database(); |  | ||||||
| 
 |  | ||||||
|         if ($db->count_tables() > 0) { |  | ||||||
|             print <<<EOD |  | ||||||
| 			<div id="installer"> |  | ||||||
| 				<h1>Shimmie Installer</h1> |  | ||||||
| 				<h3>Warning: The Database schema is not empty!</h3> |  | ||||||
| 				<div class="container"> |  | ||||||
| 					<p>Please ensure that the database you are installing Shimmie with is empty before continuing.</p> |  | ||||||
| 					<p>Once you have emptied the database of any tables, please hit 'refresh' to continue.</p> |  | ||||||
| 					<br/><br/> |  | ||||||
| 				</div> |  | ||||||
| 			</div> |  | ||||||
| EOD; |  | ||||||
|             exit(2); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         $db->create_table("aliases", " |  | ||||||
| 			oldtag VARCHAR(128) NOT NULL, |  | ||||||
| 			newtag VARCHAR(128) NOT NULL, |  | ||||||
| 			PRIMARY KEY (oldtag) |  | ||||||
| 		");
 |  | ||||||
|         $db->execute("CREATE INDEX aliases_newtag_idx ON aliases(newtag)", []); |  | ||||||
| 
 |  | ||||||
|         $db->create_table("config", " |  | ||||||
| 			name VARCHAR(128) NOT NULL, |  | ||||||
| 			value TEXT, |  | ||||||
| 			PRIMARY KEY (name) |  | ||||||
| 		");
 |  | ||||||
|         $db->create_table("users", " |  | ||||||
| 			id SCORE_AIPK, |  | ||||||
| 			name VARCHAR(32) UNIQUE NOT NULL, |  | ||||||
| 			pass VARCHAR(250), |  | ||||||
| 			joindate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |  | ||||||
| 			class VARCHAR(32) NOT NULL DEFAULT 'user', |  | ||||||
| 			email VARCHAR(128) |  | ||||||
| 		");
 |  | ||||||
|         $db->execute("CREATE INDEX users_name_idx ON users(name)", []); |  | ||||||
| 
 |  | ||||||
|         $db->create_table("images", " |  | ||||||
| 			id SCORE_AIPK, |  | ||||||
| 			owner_id INTEGER NOT NULL, |  | ||||||
| 			owner_ip SCORE_INET NOT NULL, |  | ||||||
| 			filename VARCHAR(64) NOT NULL, |  | ||||||
| 			filesize INTEGER NOT NULL, |  | ||||||
| 			hash CHAR(32) UNIQUE NOT NULL, |  | ||||||
| 			ext CHAR(4) NOT NULL, |  | ||||||
| 			source VARCHAR(255), |  | ||||||
| 			width INTEGER NOT NULL, |  | ||||||
| 			height INTEGER NOT NULL, |  | ||||||
| 			posted TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |  | ||||||
| 			locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N, |  | ||||||
| 			FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT |  | ||||||
| 		");
 |  | ||||||
|         $db->execute("CREATE INDEX images_owner_id_idx ON images(owner_id)", []); |  | ||||||
|         $db->execute("CREATE INDEX images_width_idx ON images(width)", []); |  | ||||||
|         $db->execute("CREATE INDEX images_height_idx ON images(height)", []); |  | ||||||
|         $db->execute("CREATE INDEX images_hash_idx ON images(hash)", []); |  | ||||||
| 
 |  | ||||||
|         $db->create_table("tags", " |  | ||||||
| 			id SCORE_AIPK, |  | ||||||
| 			tag VARCHAR(64) UNIQUE NOT NULL, |  | ||||||
| 			count INTEGER NOT NULL DEFAULT 0 |  | ||||||
| 		");
 |  | ||||||
|         $db->execute("CREATE INDEX tags_tag_idx ON tags(tag)", []); |  | ||||||
| 
 |  | ||||||
|         $db->create_table("image_tags", " |  | ||||||
| 			image_id INTEGER NOT NULL, |  | ||||||
| 			tag_id INTEGER NOT NULL, |  | ||||||
| 			UNIQUE(image_id, tag_id), |  | ||||||
| 			FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE, |  | ||||||
| 			FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE |  | ||||||
| 		");
 |  | ||||||
|         $db->execute("CREATE INDEX images_tags_image_id_idx ON image_tags(image_id)", []); |  | ||||||
|         $db->execute("CREATE INDEX images_tags_tag_id_idx ON image_tags(tag_id)", []); |  | ||||||
| 
 |  | ||||||
|         $db->execute("INSERT INTO config(name, value) VALUES('db_version', 11)"); |  | ||||||
|         $db->commit(); |  | ||||||
|     } catch (PDOException $e) { |  | ||||||
|         handle_db_errors(true, "An error occurred while trying to create the database tables necessary for Shimmie.", $e->getMessage(), 3); |  | ||||||
|     } catch (Exception $e) { |  | ||||||
|         handle_db_errors(false, "An unknown error occurred while trying to insert data into the database.", $e->getMessage(), 4); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function insert_defaults() |  | ||||||
| { |  | ||||||
|     try { |  | ||||||
|         $db = new Database(); |  | ||||||
| 
 |  | ||||||
|         $db->execute("INSERT INTO users(name, pass, joindate, class) VALUES(:name, :pass, now(), :class)", ["name" => 'Anonymous', "pass" => null, "class" => 'anonymous']); |  | ||||||
|         $db->execute("INSERT INTO config(name, value) VALUES(:name, :value)", ["name" => 'anon_id', "value" => $db->get_last_insert_id('users_id_seq')]); |  | ||||||
| 
 |  | ||||||
|         if (check_im_version() > 0) { |  | ||||||
|             $db->execute("INSERT INTO config(name, value) VALUES(:name, :value)", ["name" => 'thumb_engine', "value" => 'convert']); |  | ||||||
|         } |  | ||||||
|         $db->commit(); |  | ||||||
|     } catch (PDOException $e) { |  | ||||||
|         handle_db_errors(true, "An error occurred while trying to insert data into the database.", $e->getMessage(), 5); |  | ||||||
|     } catch (Exception $e) { |  | ||||||
|         handle_db_errors(false, "An unknown error occurred while trying to insert data into the database.", $e->getMessage(), 6); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function build_dirs() |  | ||||||
| { |  | ||||||
|     $data_exists = file_exists("data") || mkdir("data"); |  | ||||||
|     $data_writable = is_writable("data") || chmod("data", 0755); |  | ||||||
| 
 |  | ||||||
|     if (!$data_exists || !$data_writable) { |  | ||||||
|         print " |  | ||||||
| 		<div id='installer'> |  | ||||||
| 			<h1>Shimmie Installer</h1> |  | ||||||
| 			<h3>Directory Permissions Error:</h3> |  | ||||||
| 			<div class='container'> |  | ||||||
| 				<p>Shimmie needs to have a 'data' folder in its directory, writable by the PHP user.</p> |  | ||||||
| 				<p>If you see this error, if probably means the folder is owned by you, and it needs to be writable by the web server.</p> |  | ||||||
| 				<p>PHP reports that it is currently running as user: ".$_ENV["USER"]." (". $_SERVER["USER"] .")</p> |  | ||||||
| 				<p>Once you have created this folder and / or changed the ownership of the shimmie folder, hit 'refresh' to continue.</p> |  | ||||||
| 				<br/><br/> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 		";
 |  | ||||||
|         exit(7); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function write_config() |  | ||||||
| { |  | ||||||
|     $file_content = '<' . '?php' . "\n" . |  | ||||||
|             "define('DATABASE_DSN', '".DATABASE_DSN."');\n" . |  | ||||||
|             '?' . '>'; |  | ||||||
| 
 |  | ||||||
|     if (!file_exists("data/config")) { |  | ||||||
|         mkdir("data/config", 0755, true); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (file_put_contents("data/config/shimmie.conf.php", $file_content, LOCK_EX)) { |  | ||||||
|         header("Location: index.php"); |  | ||||||
|         print <<<EOD |  | ||||||
| 		<div id="installer"> |  | ||||||
| 			<h1>Shimmie Installer</h1> |  | ||||||
| 			<h3>Things are OK \o/</h3> |  | ||||||
| 			<div class="container"> |  | ||||||
| 				<p>If you aren't redirected, <a href="index.php">click here to Continue</a>. |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| EOD; |  | ||||||
|     } else { |  | ||||||
|         $h_file_content = htmlentities($file_content); |  | ||||||
|         print <<<EOD |  | ||||||
| 		<div id="installer"> |  | ||||||
| 			<h1>Shimmie Installer</h1> |  | ||||||
| 			<h3>File Permissions Error:</h3> |  | ||||||
| 			<div class="container"> |  | ||||||
| 				The web server isn't allowed to write to the config file; please copy |  | ||||||
| 				the text below, save it as 'data/config/shimmie.conf.php', and upload it into the shimmie |  | ||||||
| 				folder manually. Make sure that when you save it, there is no whitespace |  | ||||||
| 				before the "<?php" or after the "?>" |  | ||||||
| 				 |  | ||||||
| 				<p><textarea cols="80" rows="2">$h_file_content</textarea> |  | ||||||
| 				 |  | ||||||
| 				<p>Once done, <a href="index.php">click here to Continue</a>. |  | ||||||
| 				<br/><br/> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| EOD; |  | ||||||
|     } |  | ||||||
|     echo "\n"; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function handle_db_errors(bool $isPDO, string $errorMessage1, string $errorMessage2, int $exitCode) |  | ||||||
| { |  | ||||||
|     $errorMessage1Extra = ($isPDO ? "Please check and ensure that the database configuration options are all correct." : "Please check the server log files for more information."); |  | ||||||
|     print <<<EOD |  | ||||||
| 		<div id="installer"> |  | ||||||
| 			<h1>Shimmie Installer</h1> |  | ||||||
| 			<h3>Unknown Error:</h3> |  | ||||||
| 			<div class="container"> |  | ||||||
| 				<p>{$errorMessage1}</p> |  | ||||||
| 				<p>{$errorMessage1Extra}</p> |  | ||||||
| 				<p>{$errorMessage2}</p> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| EOD; |  | ||||||
|     exit($exitCode); |  | ||||||
| } |  | ||||||
| ?>
 | ?>
 | ||||||
| 	</body> | 	</body> | ||||||
| </html> | </html> | ||||||
|  | |||||||
| @ -21,6 +21,26 @@ class SCoreException extends RuntimeException | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | class InstallerException extends RuntimeException | ||||||
|  | { | ||||||
|  |     /** @var string */ | ||||||
|  |     public $title; | ||||||
|  | 
 | ||||||
|  |     /** @var string */ | ||||||
|  |     public $body; | ||||||
|  | 
 | ||||||
|  |     /** @var int */ | ||||||
|  |     public $code; | ||||||
|  | 
 | ||||||
|  |     public function __construct(string $title, string $body, int $code) | ||||||
|  |     { | ||||||
|  |         parent::construct($title); | ||||||
|  |         $this->title = $title; | ||||||
|  |         $this->body = $body; | ||||||
|  |         $this->code = $code; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Class PermissionDeniedException |  * Class PermissionDeniedException | ||||||
|  * |  * | ||||||
|  | |||||||
							
								
								
									
										187
									
								
								core/util.php
									
									
									
									
									
								
							
							
						
						
									
										187
									
								
								core/util.php
									
									
									
									
									
								
							| @ -130,6 +130,36 @@ function get_memory_limit(): int | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * Check if PHP has the GD library installed | ||||||
|  |  */ | ||||||
|  | function check_gd_version(): int | ||||||
|  | { | ||||||
|  |     $gdversion = 0; | ||||||
|  | 
 | ||||||
|  |     if (function_exists('gd_info')) { | ||||||
|  |         $gd_info = gd_info(); | ||||||
|  |         if (substr_count($gd_info['GD Version'], '2.')) { | ||||||
|  |             $gdversion = 2; | ||||||
|  |         } elseif (substr_count($gd_info['GD Version'], '1.')) { | ||||||
|  |             $gdversion = 1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return $gdversion; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Check whether ImageMagick's `convert` command | ||||||
|  |  * is installed and working | ||||||
|  |  */ | ||||||
|  | function check_im_version(): int | ||||||
|  | { | ||||||
|  |     $convert_check = exec("convert"); | ||||||
|  | 
 | ||||||
|  |     return (empty($convert_check) ? 0 : 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Get the currently active IP, masked to make it not change when the last |  * Get the currently active IP, masked to make it not change when the last | ||||||
|  * octet or two change, for use in session cookies and such |  * octet or two change, for use in session cookies and such | ||||||
| @ -605,6 +635,163 @@ function _get_query(): string | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ | ||||||
|  | * Things used in the installer + unit tests                                 * | ||||||
|  | \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||||||
|  | 
 | ||||||
|  | function create_dirs() | ||||||
|  | { | ||||||
|  |     $data_exists = file_exists("data") || mkdir("data"); | ||||||
|  |     $data_writable = is_writable("data") || chmod("data", 0755); | ||||||
|  | 
 | ||||||
|  |     if (!$data_exists || !$data_writable) { | ||||||
|  |         throw new InstallerException( | ||||||
|  |             "Directory Permissions Error:", | ||||||
|  |             "<p>Shimmie needs to have a 'data' folder in its directory, writable by the PHP user.</p>
 | ||||||
|  | 			<p>If you see this error, if probably means the folder is owned by you, and it needs to be writable by the web server.</p> | ||||||
|  | 			<p>PHP reports that it is currently running as user: ".$_ENV["USER"]." (". $_SERVER["USER"] .")</p> | ||||||
|  | 			<p>Once you have created this folder and / or changed the ownership of the shimmie folder, hit 'refresh' to continue.</p>",
 | ||||||
|  |             7 | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function create_tables(Database $db) | ||||||
|  | { | ||||||
|  |     try { | ||||||
|  |         if ($db->count_tables() > 0) { | ||||||
|  |             throw new InstallerException( | ||||||
|  |                 "Warning: The Database schema is not empty!", | ||||||
|  |                 "<p>Please ensure that the database you are installing Shimmie with is empty before continuing.</p>
 | ||||||
|  | 				<p>Once you have emptied the database of any tables, please hit 'refresh' to continue.</p>",
 | ||||||
|  |                 2 | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $db->create_table("aliases", " | ||||||
|  | 			oldtag VARCHAR(128) NOT NULL, | ||||||
|  | 			newtag VARCHAR(128) NOT NULL, | ||||||
|  | 			PRIMARY KEY (oldtag) | ||||||
|  | 		");
 | ||||||
|  |         $db->execute("CREATE INDEX aliases_newtag_idx ON aliases(newtag)", []); | ||||||
|  | 
 | ||||||
|  |         $db->create_table("config", " | ||||||
|  | 			name VARCHAR(128) NOT NULL, | ||||||
|  | 			value TEXT, | ||||||
|  | 			PRIMARY KEY (name) | ||||||
|  | 		");
 | ||||||
|  |         $db->create_table("users", " | ||||||
|  | 			id SCORE_AIPK, | ||||||
|  | 			name VARCHAR(32) UNIQUE NOT NULL, | ||||||
|  | 			pass VARCHAR(250), | ||||||
|  | 			joindate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||||
|  | 			class VARCHAR(32) NOT NULL DEFAULT 'user', | ||||||
|  | 			email VARCHAR(128) | ||||||
|  | 		");
 | ||||||
|  |         $db->execute("CREATE INDEX users_name_idx ON users(name)", []); | ||||||
|  | 
 | ||||||
|  |         $db->execute("INSERT INTO users(name, pass, joindate, class) VALUES(:name, :pass, now(), :class)", ["name" => 'Anonymous', "pass" => null, "class" => 'anonymous']); | ||||||
|  |         $db->execute("INSERT INTO config(name, value) VALUES(:name, :value)", ["name" => 'anon_id', "value" => $db->get_last_insert_id('users_id_seq')]); | ||||||
|  | 
 | ||||||
|  |         if (check_im_version() > 0) { | ||||||
|  |             $db->execute("INSERT INTO config(name, value) VALUES(:name, :value)", ["name" => 'thumb_engine', "value" => 'convert']); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $db->create_table("images", " | ||||||
|  | 			id SCORE_AIPK, | ||||||
|  | 			owner_id INTEGER NOT NULL, | ||||||
|  | 			owner_ip SCORE_INET NOT NULL, | ||||||
|  | 			filename VARCHAR(64) NOT NULL, | ||||||
|  | 			filesize INTEGER NOT NULL, | ||||||
|  | 			hash CHAR(32) UNIQUE NOT NULL, | ||||||
|  | 			ext CHAR(4) NOT NULL, | ||||||
|  | 			source VARCHAR(255), | ||||||
|  | 			width INTEGER NOT NULL, | ||||||
|  | 			height INTEGER NOT NULL, | ||||||
|  | 			posted TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||||
|  | 			locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N, | ||||||
|  | 			FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE RESTRICT | ||||||
|  | 		");
 | ||||||
|  |         $db->execute("CREATE INDEX images_owner_id_idx ON images(owner_id)", []); | ||||||
|  |         $db->execute("CREATE INDEX images_width_idx ON images(width)", []); | ||||||
|  |         $db->execute("CREATE INDEX images_height_idx ON images(height)", []); | ||||||
|  |         $db->execute("CREATE INDEX images_hash_idx ON images(hash)", []); | ||||||
|  | 
 | ||||||
|  |         $db->create_table("tags", " | ||||||
|  | 			id SCORE_AIPK, | ||||||
|  | 			tag VARCHAR(64) UNIQUE NOT NULL, | ||||||
|  | 			count INTEGER NOT NULL DEFAULT 0 | ||||||
|  | 		");
 | ||||||
|  |         $db->execute("CREATE INDEX tags_tag_idx ON tags(tag)", []); | ||||||
|  | 
 | ||||||
|  |         $db->create_table("image_tags", " | ||||||
|  | 			image_id INTEGER NOT NULL, | ||||||
|  | 			tag_id INTEGER NOT NULL, | ||||||
|  | 			UNIQUE(image_id, tag_id), | ||||||
|  | 			FOREIGN KEY (image_id) REFERENCES images(id) ON DELETE CASCADE, | ||||||
|  | 			FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE | ||||||
|  | 		");
 | ||||||
|  |         $db->execute("CREATE INDEX images_tags_image_id_idx ON image_tags(image_id)", []); | ||||||
|  |         $db->execute("CREATE INDEX images_tags_tag_id_idx ON image_tags(tag_id)", []); | ||||||
|  | 
 | ||||||
|  |         $db->execute("INSERT INTO config(name, value) VALUES('db_version', 11)"); | ||||||
|  |         $db->commit(); | ||||||
|  |     } catch (PDOException $e) { | ||||||
|  |         throw new InstallerException( | ||||||
|  |             "PDO Error:", | ||||||
|  |             "<p>An error occurred while trying to create the database tables necessary for Shimmie.</p>
 | ||||||
|  | 		    <p>Please check and ensure that the database configuration options are all correct.</p> | ||||||
|  | 		    <p>{$e->getMessage()}</p>",
 | ||||||
|  |             3 | ||||||
|  |         ); | ||||||
|  |     } catch (Exception $e) { | ||||||
|  |         throw new InstallerException( | ||||||
|  |             "Unknown Error:", | ||||||
|  |             "<p>An unknown error occurred while trying to insert data into the database.</p>
 | ||||||
|  | 		    <p>Please check the server log files for more information.</p> | ||||||
|  | 		    <p>{$e->getMessage()}</p>",
 | ||||||
|  |             4 | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function write_config() | ||||||
|  | { | ||||||
|  |     $file_content = "<" . "?php\ndefine('DATABASE_DSN', '".DATABASE_DSN."');\n"; | ||||||
|  | 
 | ||||||
|  |     if (!file_exists("data/config")) { | ||||||
|  |         mkdir("data/config", 0755, true); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (file_put_contents("data/config/shimmie.conf.php", $file_content, LOCK_EX)) { | ||||||
|  |         header("Location: index.php"); | ||||||
|  |         print <<<EOD | ||||||
|  | 		<div id="installer"> | ||||||
|  | 			<h1>Shimmie Installer</h1> | ||||||
|  | 			<h3>Things are OK \o/</h3> | ||||||
|  | 			<div class="container"> | ||||||
|  | 				<p>If you aren't redirected, <a href="index.php">click here to Continue</a>. | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | EOD; | ||||||
|  |     } else { | ||||||
|  |         $h_file_content = htmlentities($file_content); | ||||||
|  |         throw new InstallerException( | ||||||
|  |             "File Permissions Error:", | ||||||
|  |             "The web server isn't allowed to write to the config file; please copy
 | ||||||
|  | 			the text below, save it as 'data/config/shimmie.conf.php', and upload it into the shimmie | ||||||
|  | 			folder manually. Make sure that when you save it, there is no whitespace | ||||||
|  | 			before the \"<?php\" or after the \"?>\" | ||||||
|  | 
 | ||||||
|  | 			<p><textarea cols='80' rows='2'>$h_file_content</textarea> | ||||||
|  | 
 | ||||||
|  | 			<p>Once done, <a href='index.php'>click here to Continue</a>.",
 | ||||||
|  |             0 | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ | ||||||
| * Code coverage                                                             * | * Code coverage                                                             * | ||||||
| \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | ||||||
|  | |||||||
| @ -10,12 +10,13 @@ $_SERVER['QUERY_STRING'] = '/'; | |||||||
| chdir(dirname(dirname(__FILE__))); | chdir(dirname(dirname(__FILE__))); | ||||||
| require_once "core/_bootstrap.php"; | require_once "core/_bootstrap.php"; | ||||||
| 
 | 
 | ||||||
| function create_user(string $name) { | function create_user(string $name) | ||||||
| 	if (is_null(User::by_name($name))) { | { | ||||||
| 	    $userPage = new UserPage(); |     if (is_null(User::by_name($name))) { | ||||||
| 	    $userPage->onUserCreation(new UserCreationEvent($name, $name, "")); |         $userPage = new UserPage(); | ||||||
| 		assert(!is_null(User::by_name($name)), "Creation of user $name failed"); |         $userPage->onUserCreation(new UserCreationEvent($name, $name, "")); | ||||||
| 	} |         assert(!is_null(User::by_name($name)), "Creation of user $name failed"); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| create_user("demo"); | create_user("demo"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user