mirror of
https://github.com/FreshRSS/FreshRSS.git
synced 2026-01-18 18:27:58 -05:00
* Minor update whitespace PHPCS rules To simplify our configuration, apply more rules, and be clearer about what is added or removed compared with PSR12. Does not change our current conventions, but just a bit more consistent. * Forgotten *.phtml * Sort exclusion patterns + add a few for Extensions repo * Relaxed some rules
130 lines
4.3 KiB
PHP
130 lines
4.3 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
FreshRSS_SystemConfiguration::register('default_system', join_path(FRESHRSS_PATH, 'config.default.php'));
|
|
FreshRSS_UserConfiguration::register('default_user', join_path(FRESHRSS_PATH, 'config-user.default.php'));
|
|
|
|
/** @return array<string,string> */
|
|
function checkRequirements(string $dbType = ''): array {
|
|
$php = version_compare(PHP_VERSION, FRESHRSS_MIN_PHP_VERSION) >= 0;
|
|
$curl = extension_loaded('curl');
|
|
$pdo_mysql = extension_loaded('pdo_mysql');
|
|
$pdo_sqlite = extension_loaded('pdo_sqlite');
|
|
$pdo_pgsql = extension_loaded('pdo_pgsql');
|
|
$message = '';
|
|
switch ($dbType) {
|
|
case 'mysql':
|
|
$pdo_sqlite = $pdo_pgsql = true;
|
|
$pdo = $pdo_mysql;
|
|
break;
|
|
case 'sqlite':
|
|
$pdo_mysql = $pdo_pgsql = true;
|
|
$pdo = $pdo_sqlite;
|
|
break;
|
|
case 'pgsql':
|
|
$pdo_mysql = $pdo_sqlite = true;
|
|
$pdo = $pdo_pgsql;
|
|
break;
|
|
case '':
|
|
$pdo = $pdo_mysql || $pdo_sqlite || $pdo_pgsql;
|
|
break;
|
|
default:
|
|
$pdo_mysql = $pdo_sqlite = $pdo_pgsql = true;
|
|
$pdo = false;
|
|
$message = 'Invalid database type!';
|
|
break;
|
|
}
|
|
$pcre = extension_loaded('pcre');
|
|
$ctype = extension_loaded('ctype');
|
|
$fileinfo = extension_loaded('fileinfo');
|
|
$dom = class_exists('DOMDocument');
|
|
$xml = function_exists('xml_parser_create');
|
|
$json = function_exists('json_encode');
|
|
$mbstring = extension_loaded('mbstring');
|
|
$data = is_dir(DATA_PATH) && touch(DATA_PATH . '/index.html'); // is_writable() is not reliable for a folder on NFS
|
|
$cache = is_dir(CACHE_PATH) && touch(CACHE_PATH . '/index.html');
|
|
$tmp = is_dir(TMP_PATH) && is_writable(TMP_PATH);
|
|
$users = is_dir(USERS_PATH) && touch(USERS_PATH . '/index.html');
|
|
$favicons = is_dir(DATA_PATH) && touch(DATA_PATH . '/favicons/index.html');
|
|
|
|
return array(
|
|
'php' => $php ? 'ok' : 'ko',
|
|
'curl' => $curl ? 'ok' : 'ko',
|
|
'pdo-mysql' => $pdo_mysql ? 'ok' : 'ko',
|
|
'pdo-sqlite' => $pdo_sqlite ? 'ok' : 'ko',
|
|
'pdo-pgsql' => $pdo_pgsql ? 'ok' : 'ko',
|
|
'pdo' => $pdo ? 'ok' : 'ko',
|
|
'pcre' => $pcre ? 'ok' : 'ko',
|
|
'ctype' => $ctype ? 'ok' : 'ko',
|
|
'fileinfo' => $fileinfo ? 'ok' : 'ko',
|
|
'dom' => $dom ? 'ok' : 'ko',
|
|
'xml' => $xml ? 'ok' : 'ko',
|
|
'json' => $json ? 'ok' : 'ko',
|
|
'mbstring' => $mbstring ? 'ok' : 'ko',
|
|
'data' => $data ? 'ok' : 'ko',
|
|
'cache' => $cache ? 'ok' : 'ko',
|
|
'tmp' => $tmp ? 'ok' : 'ko',
|
|
'users' => $users ? 'ok' : 'ko',
|
|
'favicons' => $favicons ? 'ok' : 'ko',
|
|
'message' => $message ?: '',
|
|
'all' => $php && $curl && $pdo && $pcre && $ctype && $dom && $xml &&
|
|
$data && $cache && $tmp && $users && $favicons && $message == '' ? 'ok' : 'ko'
|
|
);
|
|
}
|
|
|
|
function generateSalt(): string {
|
|
return sha1(uniqid('' . mt_rand(), true) . implode('', stat(__FILE__) ?: []));
|
|
}
|
|
|
|
/**
|
|
* @throws FreshRSS_Context_Exception
|
|
*/
|
|
function initDb(): string {
|
|
$db = FreshRSS_Context::systemConf()->db;
|
|
if (empty($db['pdo_options'])) {
|
|
$db['pdo_options'] = [];
|
|
}
|
|
$db['pdo_options'][PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
|
|
FreshRSS_Context::systemConf()->db = $db; //TODO: Remove this Minz limitation "Indirect modification of overloaded property"
|
|
|
|
if (empty($db['type'])) {
|
|
$db['type'] = 'sqlite';
|
|
}
|
|
|
|
//Attempt to auto-create database if it does not already exist
|
|
if ($db['type'] !== 'sqlite') {
|
|
Minz_ModelPdo::$usesSharedPdo = false;
|
|
$dbBase = $db['base'] ?? '';
|
|
//For first connection, use default database for PostgreSQL, empty database for MySQL / MariaDB:
|
|
$db['base'] = $db['type'] === 'pgsql' ? 'postgres' : '';
|
|
FreshRSS_Context::systemConf()->db = $db;
|
|
try {
|
|
//First connection without database name to create the database
|
|
$databaseDAO = FreshRSS_Factory::createDatabaseDAO();
|
|
} catch (Exception $ex) {
|
|
$databaseDAO = null;
|
|
}
|
|
//Restore final database parameters for auto-creation and for future connections
|
|
$db['base'] = $dbBase;
|
|
FreshRSS_Context::systemConf()->db = $db;
|
|
if ($databaseDAO != null) {
|
|
//Perform database auto-creation
|
|
$databaseDAO->create();
|
|
}
|
|
}
|
|
|
|
//New connection with the database name
|
|
$databaseDAO = FreshRSS_Factory::createDatabaseDAO();
|
|
Minz_ModelPdo::$usesSharedPdo = true;
|
|
return $databaseDAO->testConnection();
|
|
}
|
|
|
|
function setupMigrations(): bool {
|
|
$migrations_path = APP_PATH . '/migrations';
|
|
$migrations_version_path = DATA_PATH . '/applied_migrations.txt';
|
|
|
|
$migrator = new Minz_Migrator($migrations_path);
|
|
$versions = implode("\n", $migrator->versions());
|
|
return @file_put_contents($migrations_version_path, $versions) !== false;
|
|
}
|