diff --git a/app/Factories/ViewFactory.php b/app/Factories/ViewFactory.php index c5fcf3f..2ebef52 100644 --- a/app/Factories/ViewFactory.php +++ b/app/Factories/ViewFactory.php @@ -61,8 +61,7 @@ class ViewFactory $twig->addGlobal('config', $config); $twig->addGlobal('request', $request); - $twig->addGlobal('alerts', $container->get('session')->getAlert()); - $twig->addGlobal('session', $container->get('session')->all()); + $twig->addGlobal('session', $container->get('session')); $twig->addGlobal('PLATFORM_VERSION', PLATFORM_VERSION); return new View($twig); diff --git a/bin/migrate b/bin/migrate index 30980e7..879ef22 100644 --- a/bin/migrate +++ b/bin/migrate @@ -24,8 +24,7 @@ if ($config['db']['connection'] === 'sqlite' && !file_exists(__DIR__.'/../'.$con $firstMigrate = true; } -$dsn = $config['db']['connection'] === 'sqlite' ? __DIR__.'/../'.$config['db']['dsn'] : $config['db']['dsn']; -$db = new DB($config['db']['connection'].':'.$dsn, $config['db']['username'], $config['db']['password']); +$db = new DB(dsnFromConfig($config), $config['db']['username'], $config['db']['password']); $migrator = new Migrator($db, 'resources/schemas', $firstMigrate); $migrator->migrate(); diff --git a/bootstrap/app.php b/bootstrap/app.php index fb20c54..7f8bc89 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,31 +1,18 @@ enableCompilation(BASE_DIR.'/resources/cache/di/'); $builder->writeProxiesToFile(true, BASE_DIR.'/resources/cache/proxies'); } + $builder->addDefinitions([ 'config' => value($config), - - 'logger' => factory(function () { - $logger = new Logger('app'); - - $streamHandler = new RotatingFileHandler(BASE_DIR.'logs/log.txt', 10, Logger::DEBUG); - - $lineFormatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n", "Y-m-d H:i:s"); - $lineFormatter->includeStacktraces(true); - - $streamHandler->setFormatter($lineFormatter); - - $logger->pushHandler($streamHandler); - - return $logger; - }), - - 'session' => factory(function () { - return new Session('xbackbone_session', BASE_DIR.'resources/sessions'); - }), - - 'database' => factory(function (Container $container) { - $config = $container->get('config'); - return new DB(dsnFromConfig($config), $config['db']['username'], $config['db']['password']); - }), - - 'storage' => factory(function (Container $container) { - $config = $container->get('config'); - switch ($config['storage']['driver']) { - case 'local': - return new Filesystem(new Local($config['storage']['path'])); - case 's3': - $client = new S3Client([ - 'credentials' => [ - 'key' => $config['storage']['key'], - 'secret' => $config['storage']['secret'], - ], - 'region' => $config['storage']['region'], - 'version' => 'latest', - ]); - - return new Filesystem(new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path'])); - case 'dropbox': - $client = new DropboxClient($config['storage']['token']); - return new Filesystem(new DropboxAdapter($client), ['case_sensitive' => false]); - case 'ftp': - return new Filesystem(new FtpAdapter([ - 'host' => $config['storage']['host'], - 'username' => $config['storage']['username'], - 'password' => $config['storage']['password'], - 'port' => $config['storage']['port'], - 'root' => $config['storage']['path'], - 'passive' => $config['storage']['passive'], - 'ssl' => $config['storage']['ssl'], - 'timeout' => 30, - ])); - case 'google-cloud': - $client = new StorageClient([ - 'projectId' => $config['storage']['project_id'], - 'keyFilePath' => $config['storage']['key_path'], - ]); - return new Filesystem(new GoogleStorageAdapter($client, $client->bucket($config['storage']['bucket']))); - default: - throw new InvalidArgumentException('The driver specified is not supported.'); - } - }), - - 'lang' => factory(function (Container $container) { - $config = $container->get('config'); - if (isset($config['lang'])) { - return Lang::build($config['lang'], BASE_DIR.'resources/lang/'); - } - return Lang::build(Lang::recognize(), BASE_DIR.'resources/lang/'); - }), - - 'view' => factory(function (Container $container) { + View::class => factory(function (Container $container) { return ViewFactory::createAppInstance($container); }), + 'view' => get(View::class), ]); +$builder->addDefinitions(__DIR__.'/container.php'); + $app = Bridge::create($builder->build()); -$app->setBasePath(parse_url($config['base_url'], PHP_URL_PATH)); +$app->setBasePath(parse_url($config['base_url'], PHP_URL_PATH) ?: ''); if (!$config['debug']) { $app->getRouteCollector()->setCacheFile(BASE_DIR.'resources/cache/routes.cache.php'); diff --git a/bootstrap/container.php b/bootstrap/container.php new file mode 100644 index 0000000..d5a7a1c --- /dev/null +++ b/bootstrap/container.php @@ -0,0 +1,102 @@ + factory(function () { + $logger = new Logger('app'); + + $streamHandler = new RotatingFileHandler(BASE_DIR.'logs/log.txt', 10, Logger::DEBUG); + + $lineFormatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n", "Y-m-d H:i:s"); + $lineFormatter->includeStacktraces(true); + + $streamHandler->setFormatter($lineFormatter); + + $logger->pushHandler($streamHandler); + + return $logger; + }), + 'logger' => get(Logger::class), + + Session::class => factory(function () { + return new Session('xbackbone_session', BASE_DIR.'resources/sessions'); + }), + 'session' => get(Session::class), + + DB::class => factory(function (Container $container) { + $config = $container->get('config'); + return new DB(dsnFromConfig($config), $config['db']['username'], $config['db']['password']); + }), + 'database' => get(DB::class), + + Filesystem::class => factory(function (Container $container) { + $config = $container->get('config'); + switch ($config['storage']['driver']) { + case 'local': + return new Filesystem(new Local($config['storage']['path'])); + case 's3': + $client = new S3Client([ + 'credentials' => [ + 'key' => $config['storage']['key'], + 'secret' => $config['storage']['secret'], + ], + 'region' => $config['storage']['region'], + 'version' => 'latest', + ]); + + return new Filesystem(new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path'])); + case 'dropbox': + $client = new DropboxClient($config['storage']['token']); + return new Filesystem(new DropboxAdapter($client), ['case_sensitive' => false]); + case 'ftp': + return new Filesystem(new FtpAdapter([ + 'host' => $config['storage']['host'], + 'username' => $config['storage']['username'], + 'password' => $config['storage']['password'], + 'port' => $config['storage']['port'], + 'root' => $config['storage']['path'], + 'passive' => $config['storage']['passive'], + 'ssl' => $config['storage']['ssl'], + 'timeout' => 30, + ])); + case 'google-cloud': + $client = new StorageClient([ + 'projectId' => $config['storage']['project_id'], + 'keyFilePath' => $config['storage']['key_path'], + ]); + return new Filesystem(new GoogleStorageAdapter($client, $client->bucket($config['storage']['bucket']))); + default: + throw new InvalidArgumentException('The driver specified is not supported.'); + } + }), + 'storage' => get(Filesystem::class), + + Lang::class => factory(function (Container $container) { + $config = $container->get('config'); + if (isset($config['lang'])) { + return Lang::build($config['lang'], BASE_DIR.'resources/lang/'); + } + return Lang::build(Lang::recognize(), BASE_DIR.'resources/lang/'); + }), + 'lang' => get(Lang::class), +]; \ No newline at end of file diff --git a/composer.json b/composer.json index 2a3fdae..67484b1 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "sergix44/xbackbone", - "version": "3.0", + "version": "3.0.RC3", "description": "A lightweight ShareX PHP backend", "type": "project", "require": { diff --git a/composer.lock b/composer.lock index ebbc7e4..066efe3 100644 --- a/composer.lock +++ b/composer.lock @@ -1862,15 +1862,15 @@ "authors": [ { "name": "Freek Van der Herten", - "role": "Developer", "email": "freek@spatie.be", - "homepage": "https://spatie.be" + "homepage": "https://spatie.be", + "role": "Developer" }, { "name": "Alex Vanderbist", - "role": "Developer", "email": "alex.vanderbist@gmail.com", - "homepage": "https://spatie.be" + "homepage": "https://spatie.be", + "role": "Developer" } ], "description": "A minimal implementation of Dropbox API v2", @@ -2901,35 +2901,34 @@ }, { "name": "ocramius/package-versions", - "version": "1.5.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "1d32342b8c1eb27353c8887c366147b4c2da673c" + "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/1d32342b8c1eb27353c8887c366147b4c2da673c", - "reference": "1d32342b8c1eb27353c8887c366147b4c2da673c", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", + "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", "shasum": "" }, "require": { "composer-plugin-api": "^1.0.0", - "php": "^7.3.0" + "php": "^7.1.0" }, "require-dev": { - "composer/composer": "^1.8.6", - "doctrine/coding-standard": "^6.0.0", + "composer/composer": "^1.6.3", + "doctrine/coding-standard": "^5.0.1", "ext-zip": "*", - "infection/infection": "^0.13.4", - "phpunit/phpunit": "^8.2.5", - "vimeo/psalm": "^3.4.9" + "infection/infection": "^0.7.1", + "phpunit/phpunit": "^7.5.17" }, "type": "composer-plugin", "extra": { "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2948,7 +2947,7 @@ } ], "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2019-07-17T15:49:50+00:00" + "time": "2019-11-15T16:17:10+00:00" }, { "name": "phpstan/phpdoc-parser", diff --git a/install/index.php b/install/index.php index 10c1868..f960c2c 100644 --- a/install/index.php +++ b/install/index.php @@ -7,21 +7,13 @@ use App\Database\Migrator; use App\Factories\ViewFactory; use App\Web\Session; use App\Web\View; -use Aws\S3\S3Client; use DI\Bridge\Slim\Bridge; use DI\ContainerBuilder; -use Google\Cloud\Storage\StorageClient; -use League\Flysystem\Adapter\Ftp as FtpAdapter; -use League\Flysystem\Adapter\Local; -use League\Flysystem\AwsS3v3\AwsS3Adapter; use League\Flysystem\FileExistsException; use League\Flysystem\Filesystem; use Psr\Container\ContainerInterface as Container; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; -use Spatie\Dropbox\Client as DropboxClient; -use Spatie\FlysystemDropbox\DropboxAdapter; -use Superbalist\Flysystem\GoogleStorage\GoogleStorageAdapter; use function DI\factory; use function DI\get; use function DI\value; @@ -53,57 +45,12 @@ $builder = new ContainerBuilder(); $builder->addDefinitions([ 'config' => value($config), - - Session::class => factory(function () { - return new Session('xbackbone_session'); - }), - 'session' => get(Session::class), - - Filesystem::class => factory(function (Container $container) { - $config = $container->get('config'); - switch ($config['storage']['driver']) { - case 'local': - return new Filesystem(new Local($config['storage']['path'])); - case 's3': - $client = new S3Client([ - 'credentials' => [ - 'key' => $config['storage']['key'], - 'secret' => $config['storage']['secret'], - ], - 'region' => $config['storage']['region'], - 'version' => 'latest', - ]); - - return new Filesystem(new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path'])); - case 'dropbox': - $client = new DropboxClient($config['storage']['token']); - return new Filesystem(new DropboxAdapter($client), ['case_sensitive' => false]); - case 'ftp': - return new Filesystem(new FtpAdapter([ - 'host' => $config['storage']['host'], - 'username' => $config['storage']['username'], - 'password' => $config['storage']['password'], - 'port' => $config['storage']['port'], - 'root' => $config['storage']['path'], - 'passive' => $config['storage']['passive'], - 'ssl' => $config['storage']['ssl'], - 'timeout' => 30, - ])); - case 'google-cloud': - $client = new StorageClient([ - 'projectId' => $config['storage']['project_id'], - 'keyFilePath' => $config['storage']['key_path'], - ]); - return new Filesystem(new GoogleStorageAdapter($client, $client->bucket($config['storage']['bucket']))); - default: - throw new InvalidArgumentException('The driver specified is not supported.'); - } - }), - - View::class => factory(function ($container) { + View::class => factory(function (Container $container) { return ViewFactory::createInstallerInstance($container); }), + 'view' => get(View::class), ]); +$builder->addDefinitions(__DIR__.'/../bootstrap/container.php'); $app = Bridge::create($builder->build()); $app->setBasePath(parse_url($config['base_url'].'/install', PHP_URL_PATH)); @@ -142,7 +89,7 @@ $app->get('/', function (Response $response, View $view, Session $session) use ( $installed = file_exists(__DIR__.'/../config.php'); return $view->render($response, 'install.twig', [ - 'installed' => $installed + 'installed' => $installed, ]); })->setName('install'); diff --git a/install/templates/install.twig b/install/templates/install.twig index 025ad28..2d221e1 100644 --- a/install/templates/install.twig +++ b/install/templates/install.twig @@ -14,7 +14,7 @@ - +
{% include 'comp/alert.twig' %}