Fix first-time setup issues. (#68)
Fixes for issues found testing first time setup in the different configurations. Reviewed-on: https://gitea.subcultureofone.org/greg/tkr/pulls/68 Co-authored-by: Greg Sarjeant <greg@subcultureofone.org> Co-committed-by: Greg Sarjeant <greg@subcultureofone.org>
This commit is contained in:
parent
801bbebf4f
commit
d3a537aa6c
3
.gitignore
vendored
3
.gitignore
vendored
@ -14,9 +14,10 @@ storage/logs
|
|||||||
# Testing stuff
|
# Testing stuff
|
||||||
/docker-compose.yml
|
/docker-compose.yml
|
||||||
scratch
|
scratch
|
||||||
|
storage.bak
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
tkr.tgz
|
tkr.tgz
|
||||||
|
|
||||||
# Test logs
|
# Test logs
|
||||||
storage/prerequisite-check.log
|
storage/prerequisite-check.log
|
||||||
|
@ -5,6 +5,10 @@ declare(strict_types=1);
|
|||||||
// - define paths
|
// - define paths
|
||||||
// - set up autoloader
|
// - set up autoloader
|
||||||
|
|
||||||
|
// Set a couple ini settings for security
|
||||||
|
ini_set('allow_url_fopen', 0); // don't allow remote files to be read
|
||||||
|
ini_set('expose_php', 0); // don't advertise the PHP version
|
||||||
|
|
||||||
// Define all the important paths
|
// Define all the important paths
|
||||||
define('APP_ROOT', dirname(dirname(__FILE__)));
|
define('APP_ROOT', dirname(dirname(__FILE__)));
|
||||||
// Root-level directories
|
// Root-level directories
|
||||||
|
@ -13,6 +13,9 @@ RewriteRule ^(storage|src|templates|config)(/.*)?$ - [F,L]
|
|||||||
# Block access to hidden files
|
# Block access to hidden files
|
||||||
RewriteRule ^\..*$ - [F,L]
|
RewriteRule ^\..*$ - [F,L]
|
||||||
|
|
||||||
|
# Block access to setup script
|
||||||
|
RewriteRule ^tkr-setup\.php$ - [F,L]
|
||||||
|
|
||||||
# Route everything else through public/index.php
|
# Route everything else through public/index.php
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
@ -10,6 +10,7 @@ services:
|
|||||||
- ./src:/var/www/html/tkr/src
|
- ./src:/var/www/html/tkr/src
|
||||||
- ./storage:/var/www/html/tkr/storage
|
- ./storage:/var/www/html/tkr/storage
|
||||||
- ./templates:/var/www/html/tkr/templates
|
- ./templates:/var/www/html/tkr/templates
|
||||||
|
- ./tkr-setup.php:/var/www/html/tkr/tkr-setup.php
|
||||||
- ./docker/apache/shared-hosting/.htaccess:/var/www/html/tkr/.htaccess
|
- ./docker/apache/shared-hosting/.htaccess:/var/www/html/tkr/.htaccess
|
||||||
command: >
|
command: >
|
||||||
bash -c "a2enmod rewrite headers expires &&
|
bash -c "a2enmod rewrite headers expires &&
|
||||||
|
@ -10,6 +10,7 @@ services:
|
|||||||
- ./src:/var/www/tkr/src
|
- ./src:/var/www/tkr/src
|
||||||
- ./storage:/var/www/tkr/storage
|
- ./storage:/var/www/tkr/storage
|
||||||
- ./templates:/var/www/tkr/templates
|
- ./templates:/var/www/tkr/templates
|
||||||
|
- ./tkr-setup.php:/var/www/html/tkr/tkr-setup.php
|
||||||
- ./docker/apache/vps/root/tkr.my-domain.com.conf:/etc/apache2/sites-enabled/tkr.my-domain.com.conf
|
- ./docker/apache/vps/root/tkr.my-domain.com.conf:/etc/apache2/sites-enabled/tkr.my-domain.com.conf
|
||||||
command: >
|
command: >
|
||||||
bash -c "a2enmod rewrite headers expires &&
|
bash -c "a2enmod rewrite headers expires &&
|
||||||
|
@ -10,6 +10,7 @@ services:
|
|||||||
- ./src:/var/www/tkr/src
|
- ./src:/var/www/tkr/src
|
||||||
- ./storage:/var/www/tkr/storage
|
- ./storage:/var/www/tkr/storage
|
||||||
- ./templates:/var/www/tkr/templates
|
- ./templates:/var/www/tkr/templates
|
||||||
|
- ./tkr-setup.php:/var/www/html/tkr/tkr-setup.php
|
||||||
- ./docker/apache/vps/subfolder/my-domain.com.conf:/etc/apache2/sites-enabled/my-domain.com.conf
|
- ./docker/apache/vps/subfolder/my-domain.com.conf:/etc/apache2/sites-enabled/my-domain.com.conf
|
||||||
command: >
|
command: >
|
||||||
bash -c "a2enmod rewrite headers expires &&
|
bash -c "a2enmod rewrite headers expires &&
|
||||||
|
@ -20,6 +20,7 @@ services:
|
|||||||
- ./src:/var/www/tkr/src
|
- ./src:/var/www/tkr/src
|
||||||
- ./storage:/var/www/tkr/storage
|
- ./storage:/var/www/tkr/storage
|
||||||
- ./templates:/var/www/tkr/templates
|
- ./templates:/var/www/tkr/templates
|
||||||
|
- ./tkr-setup.php:/var/www/html/tkr/tkr-setup.php
|
||||||
command: >
|
command: >
|
||||||
sh -c "
|
sh -c "
|
||||||
chown -R www-data:www-data /var/www/tkr/storage &&
|
chown -R www-data:www-data /var/www/tkr/storage &&
|
||||||
|
@ -20,6 +20,7 @@ services:
|
|||||||
- ./src:/var/www/tkr/src
|
- ./src:/var/www/tkr/src
|
||||||
- ./storage:/var/www/tkr/storage
|
- ./storage:/var/www/tkr/storage
|
||||||
- ./templates:/var/www/tkr/templates
|
- ./templates:/var/www/tkr/templates
|
||||||
|
- ./tkr-setup.php:/var/www/html/tkr/tkr-setup.php
|
||||||
command: >
|
command: >
|
||||||
sh -c "
|
sh -c "
|
||||||
chown -R www-data:www-data /var/www/tkr/storage &&
|
chown -R www-data:www-data /var/www/tkr/storage &&
|
||||||
|
@ -14,6 +14,9 @@ RewriteRule ^(storage|src|templates|config)(/.*)?$ - [F,L]
|
|||||||
# Block access to hidden files
|
# Block access to hidden files
|
||||||
RewriteRule ^\..*$ - [F,L]
|
RewriteRule ^\..*$ - [F,L]
|
||||||
|
|
||||||
|
# Block access to setup script
|
||||||
|
RewriteRule ^tkr-setup\.php$ - [F,L]
|
||||||
|
|
||||||
# Route everything else through the front controller
|
# Route everything else through the front controller
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
RewriteCond %{REQUEST_FILENAME} !-d
|
||||||
|
@ -49,7 +49,8 @@ if (!$prerequisites->applyMigrations($db)){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if setup is complete (user exists and URL is configured)
|
// Check if setup is complete (user exists and URL is configured)
|
||||||
if (!(preg_match('/tkr-setup$/', $path))) {
|
// Skip the setup check for the default css
|
||||||
|
if (!(preg_match('/tkr-setup$/', $path) || preg_match('/default.css$/', $path))) {
|
||||||
try {
|
try {
|
||||||
$user_count = (int) $db->query("SELECT COUNT(*) FROM user")->fetchColumn();
|
$user_count = (int) $db->query("SELECT COUNT(*) FROM user")->fetchColumn();
|
||||||
$settings = (new SettingsModel($db))->get();
|
$settings = (new SettingsModel($db))->get();
|
||||||
@ -72,6 +73,10 @@ if (!(preg_match('/tkr-setup$/', $path))) {
|
|||||||
echo "<p>Please check your installation or contact your hosting provider.</p>";
|
echo "<p>Please check your installation or contact your hosting provider.</p>";
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// we're heading to setup. the base path hasn't been set. autodetect it
|
||||||
|
$autodetected = Util::getAutodetectedUrl();
|
||||||
|
$basePath = $autodetected['basePath'];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -92,8 +97,11 @@ Session::start();
|
|||||||
Session::generateCsrfToken();
|
Session::generateCsrfToken();
|
||||||
|
|
||||||
// Remove the base path from the URL
|
// Remove the base path from the URL
|
||||||
if (strpos($path, $app['settings']->basePath) === 0) {
|
// If basePath isn't already set (i.e. we're not autodetecting it en route to tkr-setup),
|
||||||
$path = substr($path, strlen($app['settings']->basePath));
|
// set it to the value from settings
|
||||||
|
$basePath ??= $app['settings']->basePath;
|
||||||
|
if (strpos($path, $basePath) === 0) {
|
||||||
|
$path = substr($path, strlen($basePath));
|
||||||
}
|
}
|
||||||
|
|
||||||
// strip the trailing slash from the resulting route
|
// strip the trailing slash from the resulting route
|
||||||
@ -106,7 +114,7 @@ Log::debug("Path requested: {$path}");
|
|||||||
// if this is a POST and we aren't in setup,
|
// if this is a POST and we aren't in setup,
|
||||||
// make sure there's a valid session
|
// make sure there's a valid session
|
||||||
// if not, redirect to /login or die as appropriate
|
// if not, redirect to /login or die as appropriate
|
||||||
if ($method === 'POST' && $path != 'setup') {
|
if ($method === 'POST' && $path != 'tkr-setup') {
|
||||||
if ($path != 'login'){
|
if ($path != 'login'){
|
||||||
if (!Session::isValid($_POST['csrf_token'])) {
|
if (!Session::isValid($_POST['csrf_token'])) {
|
||||||
// Invalid session - redirect to /login
|
// Invalid session - redirect to /login
|
||||||
|
@ -100,7 +100,7 @@ class CssController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the data for the selected CSS file
|
// Get the data for the selected CSS file
|
||||||
$cssId = $_POST['selectCssFile'];
|
$cssId = (int) $_POST['selectCssFile'];
|
||||||
$cssModel = new CssModel($app['db']);
|
$cssModel = new CssModel($app['db']);
|
||||||
$cssRow = $cssModel->getById($cssId);
|
$cssRow = $cssModel->getById($cssId);
|
||||||
|
|
||||||
|
@ -407,7 +407,7 @@ class Prerequisites {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createDatabase() {
|
private function createDatabase(): bool {
|
||||||
$dbFile = $this->baseDir . '/storage/db/tkr.sqlite';
|
$dbFile = $this->baseDir . '/storage/db/tkr.sqlite';
|
||||||
|
|
||||||
// Test database connection (will create file if needed)
|
// Test database connection (will create file if needed)
|
||||||
@ -442,7 +442,7 @@ class Prerequisites {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function applyMigrations($db) {
|
public function applyMigrations($db): bool {
|
||||||
try {
|
try {
|
||||||
$migrator = new Migrator($db);
|
$migrator = new Migrator($db);
|
||||||
$migrator->migrate();
|
$migrator->migrate();
|
||||||
@ -452,8 +452,6 @@ class Prerequisites {
|
|||||||
true,
|
true,
|
||||||
'All database migrations applied successfully'
|
'All database migrations applied successfully'
|
||||||
);
|
);
|
||||||
return true;
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
$this->addCheck(
|
$this->addCheck(
|
||||||
'Database Migrations',
|
'Database Migrations',
|
||||||
@ -463,6 +461,8 @@ class Prerequisites {
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate system requirements that can't be fixed by the script
|
// Validate system requirements that can't be fixed by the script
|
||||||
@ -511,6 +511,8 @@ class Prerequisites {
|
|||||||
|
|
||||||
// Create missing application components
|
// Create missing application components
|
||||||
public function createMissing(): bool {
|
public function createMissing(): bool {
|
||||||
|
// If we're calling this, there were likely setup validation errors
|
||||||
|
$currentErrors = count($this->errors);
|
||||||
$this->log("=== tkr setup started at " . date('Y-m-d H:i:s') . " ===", true);
|
$this->log("=== tkr setup started at " . date('Y-m-d H:i:s') . " ===", true);
|
||||||
|
|
||||||
if ($this->isCli) {
|
if ($this->isCli) {
|
||||||
@ -526,8 +528,8 @@ class Prerequisites {
|
|||||||
$this->generateCliSummary($results);
|
$this->generateCliSummary($results);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return true only if no errors occurred
|
// Return true only if no NEW errors occurred
|
||||||
return count($this->errors) === 0;
|
return count($this->errors) === $currentErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -7,6 +7,15 @@ class Session {
|
|||||||
// global $_SESSION associative array
|
// global $_SESSION associative array
|
||||||
public static function start(): void{
|
public static function start(): void{
|
||||||
if (session_status() === PHP_SESSION_NONE) {
|
if (session_status() === PHP_SESSION_NONE) {
|
||||||
|
// Cookie security settings
|
||||||
|
ini_set('session.cookie_httponly', 1);
|
||||||
|
ini_set('session.cookie_samesite', 'Strict');
|
||||||
|
|
||||||
|
// Enable secure cookie flag if HTTPS is being used
|
||||||
|
if (($_SERVER['HTTPS'] ?? 'off') === 'on') {
|
||||||
|
ini_set('session.cookie_secure', 1);
|
||||||
|
}
|
||||||
|
|
||||||
$existingSessionId = $_COOKIE['PHPSESSID'] ?? null;
|
$existingSessionId = $_COOKIE['PHPSESSID'] ?? null;
|
||||||
session_start();
|
session_start();
|
||||||
|
|
||||||
|
@ -125,6 +125,13 @@ class Util {
|
|||||||
$scriptName = $_SERVER['SCRIPT_NAME'] ?? '/index.php';
|
$scriptName = $_SERVER['SCRIPT_NAME'] ?? '/index.php';
|
||||||
$basePath = dirname($scriptName);
|
$basePath = dirname($scriptName);
|
||||||
|
|
||||||
|
// Handle shared hosting scenario where document root can't be set to public/
|
||||||
|
// If script name ends with /public/index.php, we need to go up one directory
|
||||||
|
if (str_ends_with($scriptName, '/public/index.php')) {
|
||||||
|
$basePath = dirname($basePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure base path always has a trailing /
|
||||||
if ($basePath === '/' || $basePath === '.' || $basePath === '') {
|
if ($basePath === '/' || $basePath === '.' || $basePath === '') {
|
||||||
$basePath = '/';
|
$basePath = '/';
|
||||||
} else {
|
} else {
|
||||||
@ -132,10 +139,7 @@ class Util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct full URL
|
// Construct full URL
|
||||||
$fullUrl = $baseUrl;
|
$fullUrl = $baseUrl . $basePath;
|
||||||
if ($basePath !== '/') {
|
|
||||||
$fullUrl .= ltrim($basePath, '/');
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'baseUrl' => $baseUrl,
|
'baseUrl' => $baseUrl,
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
<?php /** @var SettingsModel $settings */ ?>
|
<?php /** @var SettingsModel $settings */ ?>
|
||||||
<?php /** @var UserModel $user */ ?>
|
<?php /** @var UserModel $user */ ?>
|
||||||
<?php /** @var isSetup bool */ ?>
|
<?php /** @var isSetup bool */ ?>
|
||||||
<h1><?php if ($isSetup): ?>Setup<?php else: ?>Admin<?php endif; ?></h1>
|
<?php
|
||||||
|
$title = $isSetup ? 'Setup' : 'Admin';
|
||||||
|
$urlPath = $isSetup ? 'tkr-setup' : 'admin'
|
||||||
|
?>
|
||||||
|
<h1><?php echo $title ?></h1>
|
||||||
<main>
|
<main>
|
||||||
<form
|
<form
|
||||||
action="<?php echo Util::buildRelativeUrl($settings->basePath, ($isSetup ? 'setup' : 'admin')) ?>"
|
action="<?php echo Util::buildRelativeUrl($settings->basePath, $urlPath) ?>"
|
||||||
method="post">
|
method="post">
|
||||||
<input type="hidden" name="csrf_token" value="<?= Util::escape_html($_SESSION['csrf_token']) ?>">
|
<input type="hidden" name="csrf_token" value="<?php echo Util::escape_html($_SESSION['csrf_token']) ?>">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>User settings</legend>
|
<legend>User settings</legend>
|
||||||
<div class="fieldset-items">
|
<div class="fieldset-items">
|
||||||
@ -14,19 +18,19 @@
|
|||||||
<input type="text"
|
<input type="text"
|
||||||
id="username"
|
id="username"
|
||||||
name="username"
|
name="username"
|
||||||
value="<?= Util::escape_html($user->username) ?>"
|
value="<?php echo Util::escape_html($user->username) ?>"
|
||||||
required>
|
required>
|
||||||
<label for="display_name">Display name <span class=required>*</span></label>
|
<label for="display_name">Display name <span class=required>*</span></label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
id="display_name"
|
id="display_name"
|
||||||
name="display_name"
|
name="display_name"
|
||||||
value="<?= Util::escape_html($user->displayName) ?>"
|
value="<?php echo Util::escape_html($user->displayName) ?>"
|
||||||
required>
|
required>
|
||||||
<label for="website">Website </label>
|
<label for="website">Website </label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
id="website"
|
id="website"
|
||||||
name="website"
|
name="website"
|
||||||
value="<?= Util::escape_html($user->website) ?>">
|
value="<?php echo Util::escape_html($user->website) ?>">
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@ -36,36 +40,36 @@
|
|||||||
<input type="text"
|
<input type="text"
|
||||||
id="site_title"
|
id="site_title"
|
||||||
name="site_title"
|
name="site_title"
|
||||||
value="<?= Util::escape_html($settings->siteTitle) ?>"
|
value="<?php echo Util::escape_html($settings->siteTitle) ?>"
|
||||||
required>
|
required>
|
||||||
<label for="site_description">Description <span class=required>*</span></label>
|
<label for="site_description">Description <span class=required>*</span></label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
id="site_description"
|
id="site_description"
|
||||||
name="site_description"
|
name="site_description"
|
||||||
value="<?= Util::escape_html($settings->siteDescription) ?>">
|
value="<?php echo Util::escape_html($settings->siteDescription) ?>">
|
||||||
<label for="base_url">Base URL <span class=required>*</span></label>
|
<label for="base_url">Base URL <span class=required>*</span></label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
id="base_url"
|
id="base_url"
|
||||||
name="base_url"
|
name="base_url"
|
||||||
value="<?= Util::escape_html($settings->baseUrl) ?>"
|
value="<?php echo Util::escape_html($settings->baseUrl) ?>"
|
||||||
required>
|
required>
|
||||||
<label for="base_path">Base path <span class=required>*</span></label>
|
<label for="base_path">Base path <span class=required>*</span></label>
|
||||||
<input type="text"
|
<input type="text"
|
||||||
id="base_path"
|
id="base_path"
|
||||||
name="base_path"
|
name="base_path"
|
||||||
value="<?= Util::escape_html($settings->basePath) ?>"
|
value="<?php echo Util::escape_html($settings->basePath) ?>"
|
||||||
required>
|
required>
|
||||||
<label for="items_per_page">Ticks per page (max 50) <span class=required>*</span></label>
|
<label for="items_per_page">Ticks per page (max 50) <span class=required>*</span></label>
|
||||||
<input type="number"
|
<input type="number"
|
||||||
id="items_per_page"
|
id="items_per_page"
|
||||||
name="items_per_page"
|
name="items_per_page"
|
||||||
value="<?= $settings->itemsPerPage ?>" min="1" max="50"
|
value="<?php echo $settings->itemsPerPage ?>" min="1" max="50"
|
||||||
required>
|
required>
|
||||||
<label for="tick_delete_hours">Tick delete window (hours)</label>
|
<label for="tick_delete_hours">Tick delete window (hours)</label>
|
||||||
<input type="number"
|
<input type="number"
|
||||||
id="tick_delete_hours"
|
id="tick_delete_hours"
|
||||||
name="tick_delete_hours"
|
name="tick_delete_hours"
|
||||||
value="<?= ($settings->tickDeleteHours ?? 1) ?>" min="1">
|
value="<?php echo ($settings->tickDeleteHours ?? 1) ?>" min="1">
|
||||||
<label for="strict_accessibility">Strict accessibility</label>
|
<label for="strict_accessibility">Strict accessibility</label>
|
||||||
<input type="checkbox"
|
<input type="checkbox"
|
||||||
id="strict_accessibility"
|
id="strict_accessibility"
|
||||||
@ -74,10 +78,10 @@
|
|||||||
<?php if ($settings->strictAccessibility): ?> checked <?php endif; ?>>
|
<?php if ($settings->strictAccessibility): ?> checked <?php endif; ?>>
|
||||||
<label for="log_level">Log Level</label>
|
<label for="log_level">Log Level</label>
|
||||||
<select id="log_level" name="log_level">
|
<select id="log_level" name="log_level">
|
||||||
<option value="1" <?= ($settings->logLevel ?? 2) == 1 ? 'selected' : '' ?>>DEBUG</option>
|
<option value="1" <?php echo ($settings->logLevel ?? 2) == 1 ? 'selected' : '' ?>>DEBUG</option>
|
||||||
<option value="2" <?= ($settings->logLevel ?? 2) == 2 ? 'selected' : '' ?>>INFO</option>
|
<option value="2" <?php echo ($settings->logLevel ?? 2) == 2 ? 'selected' : '' ?>>INFO</option>
|
||||||
<option value="3" <?= ($settings->logLevel ?? 2) == 3 ? 'selected' : '' ?>>WARNING</option>
|
<option value="3" <?php echo ($settings->logLevel ?? 2) == 3 ? 'selected' : '' ?>>WARNING</option>
|
||||||
<option value="4" <?= ($settings->logLevel ?? 2) == 4 ? 'selected' : '' ?>>ERROR</option>
|
<option value="4" <?php echo ($settings->logLevel ?? 2) == 4 ? 'selected' : '' ?>>ERROR</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
@ -177,6 +177,7 @@ try {
|
|||||||
// Create/update settings
|
// Create/update settings
|
||||||
$settingsModel = new SettingsModel($db);
|
$settingsModel = new SettingsModel($db);
|
||||||
$settingsModel->siteTitle = $siteTitle;
|
$settingsModel->siteTitle = $siteTitle;
|
||||||
|
$settingsModel->siteDescription = $siteTitle;
|
||||||
$settingsModel->baseUrl = $baseUrl;
|
$settingsModel->baseUrl = $baseUrl;
|
||||||
$settingsModel->basePath = $basePath;
|
$settingsModel->basePath = $basePath;
|
||||||
$settings = $settingsModel->save();
|
$settings = $settingsModel->save();
|
||||||
@ -184,7 +185,7 @@ try {
|
|||||||
// Create admin user
|
// Create admin user
|
||||||
$userModel = new UserModel($db);
|
$userModel = new UserModel($db);
|
||||||
$userModel->username = $adminUsername;
|
$userModel->username = $adminUsername;
|
||||||
$userModel->display_name = $adminUsername;
|
$userModel->displayName = $adminUsername;
|
||||||
$userModel->website = '';
|
$userModel->website = '';
|
||||||
$userModel->mood = '';
|
$userModel->mood = '';
|
||||||
$user = $userModel->save();
|
$user = $userModel->save();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user