diff --git a/.gitignore b/.gitignore index fde1f90..4657986 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /config.php /errors.log /vendor +/seria.cfg diff --git a/composer.json b/composer.json index 3f37d34..22f6e64 100644 --- a/composer.json +++ b/composer.json @@ -4,6 +4,7 @@ "require": { "flashwave/index": "dev-master", "flashwave/sasae": "dev-master", + "flashwave/syokuhou": "dev-master", "erusev/parsedown": "~1.6" }, "autoload": { diff --git a/composer.lock b/composer.lock index 44d827e..5c8bd39 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6c0d442a01899edbfc60a28c35e7f945", + "content-hash": "783f9604312991e2ccea8a65f381c9a4", "packages": [ { "name": "erusev/parsedown", @@ -144,89 +144,60 @@ "time": "2023-11-20T19:09:35+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "name": "flashwave/syokuhou", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", - "shasum": "" + "url": "https://patchii.net/flash/syokuhou.git", + "reference": "fdf3c38cc216bf7024af331cbe1758532355c22f" }, "require": { - "php": ">=8.1" + "flashwave/index": "dev-master", + "php": ">=8.2" }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.4" + }, + "default-branch": true, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "Syokuhou\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "bsd-3-clause-clear" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "flashwave", + "email": "packagist@flash.moe", + "homepage": "https://flash.moe", + "role": "mom" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-05-23T14:45:45+00:00" + "description": "Configuration library for PHP.", + "homepage": "https://railgun.sh/syokuhou", + "time": "2023-11-20T19:10:04+00:00" }, { "name": "symfony/mime", - "version": "v6.3.5", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + "reference": "0a2fff95c1a10df97f571d67e76c7ae0f0d4f535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "url": "https://api.github.com/repos/symfony/mime/zipball/0a2fff95c1a10df97f571d67e76c7ae0f0d4f535", + "reference": "0a2fff95c1a10df97f571d67e76c7ae0f0d4f535", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -234,17 +205,17 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "~6.2.13|^6.3.2" + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -276,7 +247,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.5" + "source": "https://github.com/symfony/mime/tree/v7.0.0" }, "funding": [ { @@ -292,7 +263,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T06:59:36+00:00" + "time": "2023-10-19T14:20:43+00:00" }, { "name": "symfony/polyfill-ctype", @@ -707,26 +678,109 @@ "time": "2023-01-26T09:26:14+00:00" }, { - "name": "twig/html-extra", - "version": "v3.7.1", + "name": "symfony/polyfill-php80", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/twigphp/html-extra.git", - "reference": "95ceb36e70fa8d07af08cf5135ecbf5e0bd8f386" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/html-extra/zipball/95ceb36e70fa8d07af08cf5135ecbf5e0bd8f386", - "reference": "95ceb36e70fa8d07af08cf5135ecbf5e0bd8f386", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/mime": "^5.4|^6.0", - "twig/twig": "^2.7|^3.0" + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "twig/html-extra", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/html-extra.git", + "reference": "c04603bb3b71d8d2ece9e583dbf7bd77811df1f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/c04603bb3b71d8d2ece9e583dbf7bd77811df1f2", + "reference": "c04603bb3b71d8d2ece9e583dbf7bd77811df1f2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/mime": "^5.4|^6.0|^7.0", + "twig/twig": "^3.0" }, "require-dev": { - "symfony/phpunit-bridge": "^5.4|^6.3" + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -756,7 +810,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.7.1" + "source": "https://github.com/twigphp/html-extra/tree/v3.8.0" }, "funding": [ { @@ -768,30 +822,31 @@ "type": "tidelift" } ], - "time": "2023-07-29T15:34:56+00:00" + "time": "2023-11-21T14:02:01+00:00" }, { "name": "twig/twig", - "version": "v3.7.1", + "version": "v3.8.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", - "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" }, "type": "library", "autoload": { @@ -827,7 +882,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.7.1" + "source": "https://github.com/twigphp/Twig/tree/v3.8.0" }, "funding": [ { @@ -839,22 +894,22 @@ "type": "tidelift" } ], - "time": "2023-08-28T11:09:02+00:00" + "time": "2023-11-21T18:54:41+00:00" } ], "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.10.43", + "version": "1.10.50", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "2c4129f6ca8c7cfa870098884b8869b410a5a361" + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2c4129f6ca8c7cfa870098884b8869b410a5a361", - "reference": "2c4129f6ca8c7cfa870098884b8869b410a5a361", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", "shasum": "" }, "require": { @@ -903,14 +958,15 @@ "type": "tidelift" } ], - "time": "2023-11-19T19:55:25+00:00" + "time": "2023-12-13T10:59:42+00:00" } ], "aliases": [], "minimum-stability": "dev", "stability-flags": { "flashwave/index": 20, - "flashwave/sasae": 20 + "flashwave/sasae": 20, + "flashwave/syokuhou": 20 }, "prefer-stable": true, "prefer-lowest": false, diff --git a/public/index.php b/public/index.php index 01af879..cda0723 100644 --- a/public/index.php +++ b/public/index.php @@ -7,7 +7,7 @@ use Seria\Users\UserInfo; require_once __DIR__ . '/../seria.php'; $authToken = (string)filter_input(INPUT_COOKIE, 'msz_auth'); -$authInfo = ChatAuth::attempt(SERIA_CAUTH_ENDPOINT, SERIA_MSZ_SECRET, $authToken); +$authInfo = ChatAuth::attempt($cfg->scopeTo('cauth'), $authToken); if($authInfo->success) { $users = $seria->getUsersContext()->getUsers(); @@ -17,7 +17,7 @@ if($authInfo->success) { } else $sUserInfo = null; $seria->startCSRFP( - SERIA_CSRFP_SECRET, + $cfg->getString('csrfp:secret', 'mewow'), $authInfo->success ? $authToken : (string)filter_input(INPUT_SERVER, 'REMOTE_ADDR') ); diff --git a/seria.php b/seria.php index 73a9d1a..7b72992 100644 --- a/seria.php +++ b/seria.php @@ -3,6 +3,7 @@ namespace Seria; use Index\Environment; use Index\Data\DbTools; +use Syokuhou\SharpConfig; define('SERIA_STARTUP', microtime(true)); define('SERIA_ROOT', __DIR__); @@ -17,9 +18,9 @@ Environment::setDebug(SERIA_DEBUG); mb_internal_encoding('utf-8'); date_default_timezone_set('utc'); -require_once SERIA_ROOT . '/config.php'; +$cfg = SharpConfig::fromFile(SERIA_ROOT . '/seria.cfg'); -$db = DbTools::create(SERIA_DSN); +$db = DbTools::create($cfg->getString('database:dsn', 'null:')); $db->execute('SET SESSION time_zone = \'+00:00\', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\';'); -$seria = new SeriaContext($db); +$seria = new SeriaContext($db, $cfg); diff --git a/src/Auth/ChatAuth.php b/src/Auth/ChatAuth.php index 8ed0e4e..de7a04e 100644 --- a/src/Auth/ChatAuth.php +++ b/src/Auth/ChatAuth.php @@ -2,15 +2,16 @@ namespace Seria\Auth; use stdClass; +use Syokuhou\IConfig; final class ChatAuth { - public static function attempt(string $endPoint, string $secret, string $cookie): object { + public static function attempt(IConfig $config, string $cookie): object { if(!empty($cookie)) { $method = 'Misuzu'; $signature = sprintf('verify#%s#%s#%s', $method, $cookie, $_SERVER['REMOTE_ADDR']); - $signature = hash_hmac('sha256', $signature, $secret); + $signature = hash_hmac('sha256', $signature, $config->getString('secret')); - $login = curl_init($endPoint); + $login = curl_init($config->getString('endpoint')); curl_setopt_array($login, [ CURLOPT_AUTOREFERER => false, CURLOPT_FAILONERROR => false, diff --git a/src/SeriaContext.php b/src/SeriaContext.php index 345dd38..501da0f 100644 --- a/src/SeriaContext.php +++ b/src/SeriaContext.php @@ -9,12 +9,14 @@ use Index\Data\Migration\DbMigrationManager; use Index\Data\Migration\FsDbMigrationRepo; use Index\Security\CSRFP; use Sasae\SasaeEnvironment; +use Syokuhou\IConfig; use Seria\Auth\AuthInfo; use Seria\Torrents\TorrentsContext; use Seria\Users\UsersContext; final class SeriaContext { private IDbTransactions $dbConn; + private IConfig $config; private ?SasaeEnvironment $templating = null; private AuthInfo $authInfo; @@ -25,11 +27,12 @@ final class SeriaContext { private TorrentsContext $torrentsCtx; private UsersContext $usersCtx; - public function __construct(IDbTransactions $dbConn) { + public function __construct(IDbTransactions $dbConn, IConfig $config) { $this->dbConn = $dbConn; + $this->config = $config; $this->authInfo = new AuthInfo; - $this->siteInfo = new SiteInfo; + $this->siteInfo = new SiteInfo($config->scopeTo('site')); $this->torrentsCtx = new TorrentsContext($dbConn); $this->usersCtx = new UsersContext($dbConn); @@ -93,7 +96,7 @@ final class SeriaContext { cache: $isDebug ? null : ['Seria', GitInfo::hash(true)], debug: $isDebug, ); - $this->templating->addExtension(new SeriaSasaeExtension($this)); + $this->templating->addExtension(new SeriaSasaeExtension($this, $this->siteInfo)); $this->templating->addGlobal('globals', $globals); } @@ -109,7 +112,14 @@ final class SeriaContext { $routing->register(new Users\SettingsRoutes($this->authInfo, $this->usersCtx, $this->csrfp, $this->templating)); $routing->register(new Torrents\AnnounceRouting($this->torrentsCtx, $this->usersCtx)); $routing->register(new Torrents\TorrentCreateRouting($this->dbConn, $this->authInfo, $this->torrentsCtx, $this->csrfp, $this->templating)); - $routing->register(new Torrents\TorrentInfoRouting($this->authInfo, $this->torrentsCtx, $this->usersCtx, $this->csrfp, $this->templating)); + $routing->register(new Torrents\TorrentInfoRouting( + $this->config->scopeTo('announce'), + $this->authInfo, + $this->torrentsCtx, + $this->usersCtx, + $this->csrfp, + $this->templating + )); $routing->register(new Torrents\TorrentListRouting($this->authInfo, $this->torrentsCtx, $this->usersCtx, $this->templating)); return $routing; diff --git a/src/SeriaSasaeExtension.php b/src/SeriaSasaeExtension.php index 4bfab06..05a8c04 100644 --- a/src/SeriaSasaeExtension.php +++ b/src/SeriaSasaeExtension.php @@ -9,7 +9,8 @@ final class SeriaSasaeExtension extends AbstractExtension { private TorrentPeers $peers; public function __construct( - private SeriaContext $ctx + private SeriaContext $ctx, + private SiteInfo $siteInfo ) { $this->peers = $ctx->getTorrentsContext()->getPeers(); } @@ -42,7 +43,7 @@ final class SeriaSasaeExtension extends AbstractExtension { else $menu[] = [ 'text' => 'Log in', - 'url' => SERIA_CAUTH_LOGIN, + 'url' => $this->siteInfo->getLoginUrl(), ]; $menu[] = [ diff --git a/src/SiteInfo.php b/src/SiteInfo.php index d842319..57a6cb2 100644 --- a/src/SiteInfo.php +++ b/src/SiteInfo.php @@ -1,34 +1,39 @@ config->getString('name'); } public function getHost(): string { - return (string)filter_input(INPUT_SERVER, 'HTTP_HOST'); + return $this->config->getString('host'); } public function getMainSiteName(): string { - return SERIA_FLASHIINET; + return $this->config->getString('parent'); + } + + public function getLoginUrl(): string { + return $this->config->getString('login'); } public function getProfileUrl(UserInfo|string $userInfo): string { if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - return sprintf(SERIA_PROFILE_FORMAT, $userInfo); + return sprintf($this->config->getString('profile'), $userInfo); } public function getAvatarUrl(UserInfo|string $userInfo, int $res = 0): string { if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - return sprintf($res < 1 ? SERIA_AVATAR_FORMAT : SERIA_AVATAR_FORMAT_RES, $userInfo, $res); + return sprintf($this->config->getString($res < 1 ? 'avatar' : 'avatar:res'), $userInfo, $res); } } diff --git a/src/Torrents/TorrentInfoRouting.php b/src/Torrents/TorrentInfoRouting.php index d3b6c00..e232955 100644 --- a/src/Torrents/TorrentInfoRouting.php +++ b/src/Torrents/TorrentInfoRouting.php @@ -6,6 +6,7 @@ use Index\Routing\Route; use Index\Routing\RouteHandler; use Index\Security\CSRFP; use Sasae\SasaeEnvironment; +use Syokuhou\IConfig; use Seria\Auth\AuthInfo; use Seria\Users\UsersContext; @@ -13,6 +14,7 @@ class TorrentInfoRouting extends RouteHandler { private ?TorrentInfo $torrentInfo = null; public function __construct( + private IConfig $config, private AuthInfo $authInfo, private TorrentsContext $torrentsCtx, private UsersContext $usersCtx, @@ -41,15 +43,16 @@ class TorrentInfoRouting extends RouteHandler { }; } - $trackerUrl = SERIA_ANNOUNCE_URL_ANON; + $trackerUrl = ''; if($this->authInfo->isLoggedIn()) { $userInfo = $this->authInfo->getUserInfo(); $passKey = $userInfo->hasPassKey() ? $userInfo->getPassKey() : $this->usersCtx->getUsers()->updatePassKey($userInfo); - $trackerUrl = sprintf(SERIA_ANNOUNCE_URL, $passKey); - } + $trackerUrl = sprintf($this->config->getString('url:user'), $passKey); + } else + $trackerUrl = $this->config->getString('url:anon'); $response->setContentType('application/x-bittorrent'); $response->setFileName(htmlspecialchars($torrentInfo->getName()) . '.torrent');