Make installer nice again
This commit is contained in:
parent
03af4dd92f
commit
81880f7458
5 changed files with 383 additions and 383 deletions
|
@ -12,7 +12,7 @@ WORKDIR /app
|
|||
RUN composer install
|
||||
|
||||
COPY . /app/
|
||||
RUN echo '=== Installing ===' && mkdir -p data/config && echo "<?php define(\"DATABASE_DSN\", \"sqlite:data/shimmie.sqlite\");" > data/config/auto_install.conf.php && php index.php && \
|
||||
RUN echo '=== Installing ===' && mkdir -p data/config && echo "<?php \$dsn = \"sqlite:data/shimmie.sqlite\";" > data/config/auto_install.conf.php && php index.php && \
|
||||
echo '=== Smoke Test ===' && php index.php get-page /post/list && \
|
||||
echo '=== Unit Tests ===' && ./vendor/bin/phpunit --configuration tests/phpunit.xml && \
|
||||
echo '=== Coverage ===' && ./vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text && \
|
||||
|
|
|
@ -1,229 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Shimmie Installer
|
||||
*
|
||||
* @package Shimmie
|
||||
* @copyright Copyright (c) 2007-2015, Shish et al.
|
||||
* @author Shish [webmaster at shishnet.org], jgen [jeffgenovy at gmail.com]
|
||||
* @link http://code.shishnet.org/shimmie2/
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
* Initialise the database, check that folder
|
||||
* permissions are set properly.
|
||||
*
|
||||
* This file should be independent of the database
|
||||
* and other such things that aren't ready yet
|
||||
*/
|
||||
|
||||
// TODO: Rewrite the entire installer and make it more readable.
|
||||
|
||||
ob_start();
|
||||
|
||||
date_default_timezone_set('UTC');
|
||||
define("DATABASE_TIMEOUT", 10000);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Shimmie Installation</title>
|
||||
<link rel="shortcut icon" href="ext/handle_static/static/favicon.ico">
|
||||
<link rel="stylesheet" href="lib/shimmie.css" type="text/css">
|
||||
<script type="text/javascript" src="vendor/bower-asset/jquery/dist/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<?php if (false) { ?>
|
||||
<div id="installer">
|
||||
<h1>Install Error</h1>
|
||||
<div class="container">
|
||||
<p>Shimmie needs to be run via a web server with PHP support -- you
|
||||
appear to be either opening the file from your hard disk, or your
|
||||
web server is mis-configured and doesn't know how to handle PHP files.</p>
|
||||
<p>If you've installed a web server on your desktop PC, you probably
|
||||
want to visit <a href="http://localhost/">the local web server</a>.<br/><br/>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<pre style="display:none">
|
||||
<?php } elseif (!file_exists("vendor/")) { ?>
|
||||
<div id="installer">
|
||||
<h1>Install Error</h1>
|
||||
<h3>Warning: Composer vendor folder does not exist!</h3>
|
||||
<div class="container">
|
||||
<p>Shimmie is unable to find the composer vendor directory.<br>
|
||||
Have you followed the composer setup instructions found in the <a href="https://github.com/shish/shimmie2#installation-development">README</a>?</>
|
||||
|
||||
<p>If you are not intending to do any development with Shimmie, it is highly recommend you use one of the pre-packaged releases found on <a href="https://github.com/shish/shimmie2/releases">Github</a> instead.</p>
|
||||
</div>
|
||||
</div>
|
||||
<pre style="display:none">
|
||||
<?php }
|
||||
|
||||
// Pull in necessary files
|
||||
require_once "vendor/autoload.php";
|
||||
$_tracer = new EventTracer();
|
||||
|
||||
require_once "core/exceptions.php";
|
||||
require_once "core/cacheengine.php";
|
||||
require_once "core/dbengine.php";
|
||||
require_once "core/database.php";
|
||||
require_once "core/util.php";
|
||||
|
||||
if (is_readable("data/config/shimmie.conf.php")) {
|
||||
die("Shimmie is already installed.");
|
||||
}
|
||||
|
||||
do_install();
|
||||
|
||||
// TODO: Can some of these be pushed into "core/???.inc.php" ?
|
||||
|
||||
function do_install()
|
||||
{
|
||||
if (file_exists("data/config/auto_install.conf.php")) {
|
||||
require_once "data/config/auto_install.conf.php";
|
||||
} elseif (@$_POST["database_type"] == DatabaseDriver::SQLITE) {
|
||||
$id = bin2hex(random_bytes(5));
|
||||
define('DATABASE_DSN', "sqlite:data/shimmie.{$id}.sqlite");
|
||||
} elseif (isset($_POST['database_type']) && isset($_POST['database_host']) && isset($_POST['database_user']) && isset($_POST['database_name'])) {
|
||||
define('DATABASE_DSN', "{$_POST['database_type']}:user={$_POST['database_user']};password={$_POST['database_password']};host={$_POST['database_host']};dbname={$_POST['database_name']}");
|
||||
} else {
|
||||
ask_questions();
|
||||
return;
|
||||
}
|
||||
|
||||
define("CACHE_DSN", null);
|
||||
try {
|
||||
create_dirs();
|
||||
create_tables(new Database(DATABASE_DSN));
|
||||
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()
|
||||
{
|
||||
$warnings = [];
|
||||
$errors = [];
|
||||
|
||||
if (check_gd_version() == 0 && check_im_version() == 0) {
|
||||
$errors[] = "
|
||||
No thumbnailers could be found - install the imagemagick
|
||||
tools (or the PHP-GD library, if imagemagick is unavailable).
|
||||
";
|
||||
} elseif (check_im_version() == 0) {
|
||||
$warnings[] = "
|
||||
The 'convert' command (from the imagemagick package)
|
||||
could not be found - PHP-GD can be used instead, but
|
||||
the size of thumbnails will be limited.
|
||||
";
|
||||
}
|
||||
|
||||
if (!function_exists('mb_strlen')) {
|
||||
$errors[] = "
|
||||
The mbstring PHP extension is missing - multibyte languages
|
||||
(eg non-english languages) may not work right.
|
||||
";
|
||||
}
|
||||
|
||||
$drivers = PDO::getAvailableDrivers();
|
||||
if (
|
||||
!in_array(DatabaseDriver::MYSQL, $drivers) &&
|
||||
!in_array(DatabaseDriver::PGSQL, $drivers) &&
|
||||
!in_array(DatabaseDriver::SQLITE, $drivers)
|
||||
) {
|
||||
$errors[] = "
|
||||
No database connection library could be found; shimmie needs
|
||||
PDO with either Postgres, MySQL, or SQLite drivers
|
||||
";
|
||||
}
|
||||
|
||||
$db_m = in_array(DatabaseDriver::MYSQL, $drivers) ? '<option value="'. DatabaseDriver::MYSQL .'">MySQL</option>' : "";
|
||||
$db_p = in_array(DatabaseDriver::PGSQL, $drivers) ? '<option value="'. DatabaseDriver::PGSQL .'">PostgreSQL</option>' : "";
|
||||
$db_s = in_array(DatabaseDriver::SQLITE, $drivers) ? '<option value="'. DatabaseDriver::SQLITE .'">SQLite</option>' : "";
|
||||
|
||||
$warn_msg = $warnings ? "<h3>Warnings</h3>".implode("\n<p>", $warnings) : "";
|
||||
$err_msg = $errors ? "<h3>Errors</h3>".implode("\n<p>", $errors) : "";
|
||||
|
||||
print <<<EOD
|
||||
<div id="installer">
|
||||
<h1>Shimmie Installer</h1>
|
||||
|
||||
<div class="container">
|
||||
$warn_msg
|
||||
$err_msg
|
||||
|
||||
<h3>Database Install</h3>
|
||||
<form action="index.php" method="POST">
|
||||
<center>
|
||||
<table class='form'>
|
||||
<tr>
|
||||
<th>Type:</th>
|
||||
<td><select name="database_type" id="database_type" onchange="update_qs();">
|
||||
$db_m
|
||||
$db_p
|
||||
$db_s
|
||||
</select></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>Host:</th>
|
||||
<td><input type="text" name="database_host" size="40" value="localhost"></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>Username:</th>
|
||||
<td><input type="text" name="database_user" size="40"></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>Password:</th>
|
||||
<td><input type="password" name="database_password" size="40"></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>DB Name:</th>
|
||||
<td><input type="text" name="database_name" size="40" value="shimmie"></td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><input type="submit" value="Go!"></td></tr>
|
||||
</table>
|
||||
</center>
|
||||
<script>
|
||||
$(function() {
|
||||
update_qs();
|
||||
});
|
||||
function update_qs() {
|
||||
$(".dbconf").hide();
|
||||
var seldb = $("#database_type").val() || "none";
|
||||
$("."+seldb).show();
|
||||
}
|
||||
</script>
|
||||
</form>
|
||||
|
||||
<h3>Help</h3>
|
||||
|
||||
<p class="dbconf mysql pgsql">
|
||||
Please make sure the database you have chosen exists and is empty.<br>
|
||||
The username provided must have access to create tables within the database.
|
||||
</p>
|
||||
<p class="dbconf sqlite">
|
||||
For SQLite the database name will be a filename on disk, relative to
|
||||
where shimmie was installed.
|
||||
</p>
|
||||
<p class="dbconf none">
|
||||
Drivers can generally be downloaded with your OS package manager;
|
||||
for Debian / Ubuntu you want php-pgsql, php-mysql, or php-sqlite.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
EOD;
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
359
core/install.php
Normal file
359
core/install.php
Normal file
|
@ -0,0 +1,359 @@
|
|||
<?php
|
||||
/**
|
||||
* Shimmie Installer
|
||||
*
|
||||
* @package Shimmie
|
||||
* @copyright Copyright (c) 2007-2015, Shish et al.
|
||||
* @author Shish [webmaster at shishnet.org], jgen [jeffgenovy at gmail.com]
|
||||
* @link http://code.shishnet.org/shimmie2/
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
|
||||
*
|
||||
* Initialise the database, check that folder
|
||||
* permissions are set properly.
|
||||
*
|
||||
* This file should be independent of the database
|
||||
* and other such things that aren't ready yet
|
||||
*/
|
||||
|
||||
function install() {
|
||||
date_default_timezone_set('UTC');
|
||||
define("DATABASE_TIMEOUT", 10000);
|
||||
|
||||
if (is_readable("data/config/shimmie.conf.php")) {
|
||||
exit_with_page(
|
||||
"Shimmie is already installed.",
|
||||
"data/config/shimmie.conf.php exists, how did you get here?"
|
||||
);
|
||||
}
|
||||
|
||||
if (!file_exists("vendor/")) {
|
||||
exit_with_page("Install Error", "
|
||||
<p>Shimmie is unable to find the composer vendor directory.</p>
|
||||
<p>Have you followed the composer setup instructions found in the
|
||||
<a href=\"https://github.com/shish/shimmie2#installation-development\">README</a>?</p>
|
||||
<p>If you are not intending to do any development with Shimmie,
|
||||
it is highly recommend you use one of the pre-packaged releases
|
||||
found on <a href=\"https://github.com/shish/shimmie2/releases\">Github</a> instead.</p>
|
||||
");
|
||||
}
|
||||
|
||||
// Pull in necessary files
|
||||
require_once "vendor/autoload.php";
|
||||
global $_tracer;
|
||||
$_tracer = new EventTracer();
|
||||
|
||||
require_once "core/exceptions.php";
|
||||
require_once "core/cacheengine.php";
|
||||
require_once "core/dbengine.php";
|
||||
require_once "core/database.php";
|
||||
require_once "core/util.php";
|
||||
|
||||
$dsn = get_dsn();
|
||||
if($dsn) {
|
||||
do_install($dsn);
|
||||
} else {
|
||||
ask_questions();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function get_dsn() {
|
||||
if (file_exists("data/config/auto_install.conf.php")) {
|
||||
$dsn = null;
|
||||
require_once "data/config/auto_install.conf.php";
|
||||
} elseif (@$_POST["database_type"] == DatabaseDriver::SQLITE) {
|
||||
$id = bin2hex(random_bytes(5));
|
||||
$dsn = "sqlite:data/shimmie.{$id}.sqlite";
|
||||
} elseif (isset($_POST['database_type']) && isset($_POST['database_host']) && isset($_POST['database_user']) && isset($_POST['database_name'])) {
|
||||
$dsn = "{$_POST['database_type']}:user={$_POST['database_user']};password={$_POST['database_password']};host={$_POST['database_host']};dbname={$_POST['database_name']}";
|
||||
} else {
|
||||
$dsn = null;
|
||||
}
|
||||
return $dsn;
|
||||
}
|
||||
|
||||
function do_install($dsn) {
|
||||
try {
|
||||
create_dirs();
|
||||
create_tables(new Database($dsn));
|
||||
write_config($dsn);
|
||||
} catch (InstallerException $e) {
|
||||
exit_with_page($e->title, $e->body, $e->code);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function ask_questions()
|
||||
{
|
||||
$warnings = [];
|
||||
$errors = [];
|
||||
|
||||
if (check_gd_version() == 0 && check_im_version() == 0) {
|
||||
$errors[] = "
|
||||
No thumbnailers could be found - install the imagemagick
|
||||
tools (or the PHP-GD library, if imagemagick is unavailable).
|
||||
";
|
||||
} elseif (check_im_version() == 0) {
|
||||
$warnings[] = "
|
||||
The 'convert' command (from the imagemagick package)
|
||||
could not be found - PHP-GD can be used instead, but
|
||||
the size of thumbnails will be limited.
|
||||
";
|
||||
}
|
||||
|
||||
if (!function_exists('mb_strlen')) {
|
||||
$errors[] = "
|
||||
The mbstring PHP extension is missing - multibyte languages
|
||||
(eg non-english languages) may not work right.
|
||||
";
|
||||
}
|
||||
|
||||
$drivers = PDO::getAvailableDrivers();
|
||||
if (
|
||||
!in_array(DatabaseDriver::MYSQL, $drivers) &&
|
||||
!in_array(DatabaseDriver::PGSQL, $drivers) &&
|
||||
!in_array(DatabaseDriver::SQLITE, $drivers)
|
||||
) {
|
||||
$errors[] = "
|
||||
No database connection library could be found; shimmie needs
|
||||
PDO with either Postgres, MySQL, or SQLite drivers
|
||||
";
|
||||
}
|
||||
|
||||
$db_m = in_array(DatabaseDriver::MYSQL, $drivers) ? '<option value="'. DatabaseDriver::MYSQL .'">MySQL</option>' : "";
|
||||
$db_p = in_array(DatabaseDriver::PGSQL, $drivers) ? '<option value="'. DatabaseDriver::PGSQL .'">PostgreSQL</option>' : "";
|
||||
$db_s = in_array(DatabaseDriver::SQLITE, $drivers) ? '<option value="'. DatabaseDriver::SQLITE .'">SQLite</option>' : "";
|
||||
|
||||
$warn_msg = $warnings ? "<h3>Warnings</h3>".implode("\n<p>", $warnings) : "";
|
||||
$err_msg = $errors ? "<h3>Errors</h3>".implode("\n<p>", $errors) : "";
|
||||
|
||||
exit_with_page(
|
||||
"Install Options",
|
||||
<<<EOD
|
||||
$warn_msg
|
||||
$err_msg
|
||||
|
||||
<h3>Database Install</h3>
|
||||
<form action="index.php" method="POST">
|
||||
<center>
|
||||
<table class='form'>
|
||||
<tr>
|
||||
<th>Type:</th>
|
||||
<td><select name="database_type" id="database_type" onchange="update_qs();">
|
||||
$db_m
|
||||
$db_p
|
||||
$db_s
|
||||
</select></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>Host:</th>
|
||||
<td><input type="text" name="database_host" size="40" value="localhost"></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>Username:</th>
|
||||
<td><input type="text" name="database_user" size="40"></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>Password:</th>
|
||||
<td><input type="password" name="database_password" size="40"></td>
|
||||
</tr>
|
||||
<tr class="dbconf mysql pgsql">
|
||||
<th>DB Name:</th>
|
||||
<td><input type="text" name="database_name" size="40" value="shimmie"></td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><input type="submit" value="Go!"></td></tr>
|
||||
</table>
|
||||
</center>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', update_qs);
|
||||
function q(n) {
|
||||
return document.querySelectorAll(n);
|
||||
}
|
||||
function update_qs() {
|
||||
Array.prototype.forEach.call(q('.dbconf'), function(el, i){
|
||||
el.style.display = 'none';
|
||||
});
|
||||
let seldb = q("#database_type")[0].value || "none";
|
||||
Array.prototype.forEach.call(q('.'+seldb), function(el, i){
|
||||
el.style.display = null;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</form>
|
||||
|
||||
<h3>Help</h3>
|
||||
<p class="dbconf mysql pgsql">
|
||||
Please make sure the database you have chosen exists and is empty.<br>
|
||||
The username provided must have access to create tables within the database.
|
||||
</p>
|
||||
<p class="dbconf sqlite">
|
||||
For SQLite the database name will be a filename on disk, relative to
|
||||
where shimmie was installed.
|
||||
</p>
|
||||
<p class="dbconf none">
|
||||
Drivers can generally be downloaded with your OS package manager;
|
||||
for Debian / Ubuntu you want php-pgsql, php-mysql, or php-sqlite.
|
||||
</p>
|
||||
EOD);
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function write_config($dsn)
|
||||
{
|
||||
$file_content = "<" . "?php\ndefine('DATABASE_DSN', '$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");
|
||||
exit_with_page(
|
||||
"Installation Successful",
|
||||
"<p>If you aren't redirected, <a href=\"index.php\">click here to Continue</a>."
|
||||
);
|
||||
} 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\".
|
||||
|
||||
<p><textarea cols='80' rows='2'>$h_file_content</textarea>
|
||||
|
||||
<p>Once done, <a href='index.php'>click here to Continue</a>.",
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function exit_with_page($title, $body, $code=0) {
|
||||
print("<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Shimmie Installer</title>
|
||||
<link rel=\"shortcut icon\" href=\"ext/handle_static/static/favicon.ico\">
|
||||
<link rel=\"stylesheet\" href=\"ext/handle_static/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);
|
||||
}
|
151
core/util.php
151
core/util.php
|
@ -471,10 +471,8 @@ function get_debug_info(): string
|
|||
function require_all(array $files): void
|
||||
{
|
||||
foreach ($files as $filename) {
|
||||
if (basename($filename)[0] != "_") {
|
||||
require_once $filename;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _load_core_files()
|
||||
|
@ -630,155 +628,6 @@ 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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
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 *
|
||||
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
|
23
index.php
23
index.php
|
@ -48,7 +48,8 @@
|
|||
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
if (!file_exists("data/config/shimmie.conf.php")) {
|
||||
require_once "core/_install.php";
|
||||
require_once "core/install.php";
|
||||
install();
|
||||
exit;
|
||||
}
|
||||
|
||||
|
@ -99,17 +100,37 @@ require_once "core/util.php";
|
|||
global $cache, $config, $database, $user, $page, $_tracer;
|
||||
_sanitise_environment();
|
||||
$_tracer->begin("Bootstrap");
|
||||
$_tracer->begin("Load core");
|
||||
_load_core_files();
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Cache");
|
||||
$cache = new Cache(CACHE_DSN);
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Database");
|
||||
$database = new Database(DATABASE_DSN);
|
||||
$_tracer->end();
|
||||
$_tracer->begin("DatabaseConfig");
|
||||
$config = new DatabaseConfig($database);
|
||||
$_tracer->end();
|
||||
$_tracer->begin("ExtensionInfo");
|
||||
ExtensionInfo::load_all_extension_info();
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Extension");
|
||||
Extension::determine_enabled_extensions();
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Load extension");
|
||||
require_all(zglob("ext/{".Extension::get_enabled_extensions_as_string()."}/main.php"));
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Load theme");
|
||||
_load_theme_files();
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Page");
|
||||
$page = new Page();
|
||||
$_tracer->end();
|
||||
$_tracer->begin("Load Event Listeners");
|
||||
_load_event_listeners();
|
||||
$_tracer->end();
|
||||
$_tracer->end();
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
||||
|
|
Reference in a new issue