diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php index 9abb28229e..95346c84e3 100644 --- a/.phpstorm.meta.php +++ b/.phpstorm.meta.php @@ -5,2406 +5,2384 @@ namespace PHPSTORM_META; /** - * PhpStorm Meta file, to provide autocomplete information for PhpStorm. - * - * @author Barry vd. Heuvel - * - * @see https://github.com/barryvdh/laravel-ide-helper - */ - override(new \Illuminate\Contracts\Container\Container(), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\Illuminate\Container\Container::makeWith(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\Illuminate\Contracts\Container\Container::get(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\Illuminate\Contracts\Container\Container::make(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\Illuminate\Contracts\Container\Container::makeWith(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\App::get(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\App::make(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\App::makeWith(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\app(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\resolve(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); - override(\Psr\Container\ContainerInterface::get(0), map([ - '' => '@', - 'AccessControl' => \App\ModelFunctions\SessionFunctions::class, - 'App\Actions\AlbumAuthorisationProvider' => \App\Actions\AlbumAuthorisationProvider::class, - 'App\Actions\PhotoAuthorisationProvider' => \App\Actions\PhotoAuthorisationProvider::class, - 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, - 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, - 'App\Assets\Helpers' => \App\Assets\Helpers::class, - 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, - 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, - 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, - 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, - 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, - 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, - 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, - 'App\ModelFunctions\SessionFunctions' => \App\ModelFunctions\SessionFunctions::class, - 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, - 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, - 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, - 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, - 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, - 'Helpers' => \App\Assets\Helpers::class, - 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, - 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, - 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, - 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, - 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, - 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, - 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, - 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, - 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, - 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, - 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, - 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, - 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, - 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, - 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, - 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, - 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, - 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, - 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, - 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, - 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, - 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, - 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, - 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, - 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, - 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, - 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, - 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, - 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, - 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, - 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, - 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, - 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, - 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, - 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, - 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, - 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, - 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, - 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, - 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, - 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, - 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, - 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, - 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, - 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, - 'auth' => \Illuminate\Auth\AuthManager::class, - 'auth.driver' => \Illuminate\Auth\SessionGuard::class, - 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, - 'cache' => \Illuminate\Cache\CacheManager::class, - 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, - 'cache.store' => \Illuminate\Cache\Repository::class, - 'clockwork' => \Clockwork\Clockwork::class, - 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, - 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, - 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, - 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, - 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, - 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, - 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, - 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, - 'clockwork.request' => \Clockwork\Request\Request::class, - 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, - 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, - 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, - 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, - 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, - 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, - 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, - 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, - 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, - 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, - 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, - 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, - 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, - 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, - 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, - 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, - 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, - 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, - 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, - 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, - 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, - 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, - 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, - 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, - 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, - 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, - 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, - 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, - 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, - 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, - 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, - 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, - 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, - 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, - 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, - 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, - 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, - 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, - 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, - 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, - 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, - 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, - 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, - 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, - 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, - 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, - 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, - 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, - 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, - 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, - 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, - 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, - 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, - 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, - 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, - 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, - 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, - 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, - 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, - 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, - 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, - 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, - 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, - 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, - 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, - 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, - 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, - 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, - 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, - 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, - 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, - 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, - 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, - 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, - 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, - 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, - 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, - 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, - 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, - 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, - 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, - 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, - 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, - 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, - 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, - 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, - 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, - 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, - 'composer' => \Illuminate\Support\Composer::class, - 'cookie' => \Illuminate\Cookie\CookieJar::class, - 'db' => \Illuminate\Database\DatabaseManager::class, - 'db.connection' => \Illuminate\Database\MySqlConnection::class, - 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, - 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, - 'encrypter' => \Illuminate\Encryption\Encrypter::class, - 'events' => \Illuminate\Events\Dispatcher::class, - 'files' => \Illuminate\Filesystem\Filesystem::class, - 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, - 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, - 'hash' => \Illuminate\Hashing\HashManager::class, - 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, - 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, - 'log' => \Illuminate\Log\LogManager::class, - 'mail.manager' => \Illuminate\Mail\MailManager::class, - 'mailer' => \Illuminate\Mail\Mailer::class, - 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, - 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, - 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, - 'migrator' => \Illuminate\Database\Migrations\Migrator::class, - 'queue' => \Illuminate\Queue\QueueManager::class, - 'queue.connection' => \Illuminate\Queue\SyncQueue::class, - 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, - 'queue.listener' => \Illuminate\Queue\Listener::class, - 'queue.worker' => \Illuminate\Queue\Worker::class, - 'redirect' => \Illuminate\Routing\Redirector::class, - 'redis' => \Illuminate\Redis\RedisManager::class, - 'router' => \Illuminate\Routing\Router::class, - 'session' => \Illuminate\Session\SessionManager::class, - 'session.store' => \Illuminate\Session\Store::class, - 'translation.loader' => \Illuminate\Translation\FileLoader::class, - 'translator' => \Illuminate\Translation\Translator::class, - 'url' => \Illuminate\Routing\UrlGenerator::class, - 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, - 'view' => \Illuminate\View\Factory::class, - 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, - 'view.finder' => \Illuminate\View\FileViewFinder::class, - ])); + * PhpStorm Meta file, to provide autocomplete information for PhpStorm. + * + * @author Barry vd. Heuvel + * + * @see https://github.com/barryvdh/laravel-ide-helper + */ +override(new \Illuminate\Contracts\Container\Container(), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\Illuminate\Container\Container::makeWith(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\Illuminate\Contracts\Container\Container::get(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\Illuminate\Contracts\Container\Container::make(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\Illuminate\Contracts\Container\Container::makeWith(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\App::get(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\App::make(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\App::makeWith(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\app(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\resolve(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); +override(\Psr\Container\ContainerInterface::get(0), map([ + '' => '@', + 'App\Actions\Update\Apply' => \App\Actions\Update\Apply::class, + 'App\Actions\Update\Check' => \App\Actions\Update\Check::class, + 'App\Assets\Helpers' => \App\Assets\Helpers::class, + 'App\Policies\AlbumQueryPolicy' => \App\Policies\AlbumQueryPolicy::class, + 'App\Policies\PhotoQueryPolicy' => \App\Policies\PhotoQueryPolicy::class, + 'App\Contracts\SizeVariantFactory' => \App\Image\SizeVariantDefaultFactory::class, + 'App\Contracts\SizeVariantNamingStrategy' => \App\Assets\SizeVariantGroupedWithRandomSuffixNamingStrategy::class, + 'App\Factories\AlbumFactory' => \App\Factories\AlbumFactory::class, + 'App\Metadata\GitHubFunctions' => \App\Metadata\GitHubFunctions::class, + 'App\Metadata\GitRequest' => \App\Metadata\GitRequest::class, + 'App\Metadata\LycheeVersion' => \App\Metadata\LycheeVersion::class, + 'App\ModelFunctions\ConfigFunctions' => \App\ModelFunctions\ConfigFunctions::class, + 'App\ModelFunctions\SymLinkFunctions' => \App\ModelFunctions\SymLinkFunctions::class, + 'Barryvdh\Debugbar\LaravelDebugbar' => \Barryvdh\Debugbar\LaravelDebugbar::class, + 'Cose\Algorithm\Manager' => \Cose\Algorithm\Manager::class, + 'DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection' => \DarkGhostHunter\Larapass\WebAuthn\PublicKeyCredentialParametersCollection::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestCreator::class, + 'DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator' => \DarkGhostHunter\Larapass\WebAuthn\WebAuthnAttestValidator::class, + 'Helpers' => \App\Assets\Helpers::class, + 'Illuminate\Auth\Middleware\RequirePassword' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'Illuminate\Broadcasting\BroadcastManager' => \Illuminate\Broadcasting\BroadcastManager::class, + 'Illuminate\Bus\BatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\DatabaseBatchRepository' => \Illuminate\Bus\DatabaseBatchRepository::class, + 'Illuminate\Bus\Dispatcher' => \Illuminate\Bus\Dispatcher::class, + 'Illuminate\Cache\RateLimiter' => \Illuminate\Cache\RateLimiter::class, + 'Illuminate\Console\Scheduling\Schedule' => \Illuminate\Console\Scheduling\Schedule::class, + 'Illuminate\Console\Scheduling\ScheduleClearCacheCommand' => \Illuminate\Console\Scheduling\ScheduleClearCacheCommand::class, + 'Illuminate\Console\Scheduling\ScheduleFinishCommand' => \Illuminate\Console\Scheduling\ScheduleFinishCommand::class, + 'Illuminate\Console\Scheduling\ScheduleListCommand' => \Illuminate\Console\Scheduling\ScheduleListCommand::class, + 'Illuminate\Console\Scheduling\ScheduleRunCommand' => \Illuminate\Console\Scheduling\ScheduleRunCommand::class, + 'Illuminate\Console\Scheduling\ScheduleTestCommand' => \Illuminate\Console\Scheduling\ScheduleTestCommand::class, + 'Illuminate\Console\Scheduling\ScheduleWorkCommand' => \Illuminate\Console\Scheduling\ScheduleWorkCommand::class, + 'Illuminate\Contracts\Auth\Access\Gate' => \Illuminate\Auth\Access\Gate::class, + 'Illuminate\Contracts\Broadcasting\Broadcaster' => \Illuminate\Broadcasting\Broadcasters\LogBroadcaster::class, + 'Illuminate\Contracts\Console\Kernel' => \App\Console\Kernel::class, + 'Illuminate\Contracts\Debug\ExceptionHandler' => \NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler::class, + 'Illuminate\Contracts\Http\Kernel' => \App\Http\Kernel::class, + 'Illuminate\Contracts\Pipeline\Hub' => \Illuminate\Pipeline\Hub::class, + 'Illuminate\Contracts\Queue\EntityResolver' => \Illuminate\Database\Eloquent\QueueEntityResolver::class, + 'Illuminate\Contracts\Routing\ResponseFactory' => \Illuminate\Routing\ResponseFactory::class, + 'Illuminate\Contracts\Validation\UncompromisedVerifier' => \Illuminate\Validation\NotPwnedVerifier::class, + 'Illuminate\Database\Console\DbCommand' => \Illuminate\Database\Console\DbCommand::class, + 'Illuminate\Foundation\Mix' => \Illuminate\Foundation\Mix::class, + 'Illuminate\Foundation\PackageManifest' => \Illuminate\Foundation\PackageManifest::class, + 'Illuminate\Mail\Markdown' => \Illuminate\Mail\Markdown::class, + 'Illuminate\Notifications\ChannelManager' => \Illuminate\Notifications\ChannelManager::class, + 'Illuminate\Routing\Contracts\ControllerDispatcher' => \Illuminate\Routing\ControllerDispatcher::class, + 'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class, + 'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class, + 'Livewire\LivewireComponentsFinder' => \Livewire\LivewireComponentsFinder::class, + 'Livewire\LivewireManager' => \Livewire\LivewireManager::class, + 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, + 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, + 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\ImageOptimizer\OptimizerChain' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'Webauthn\AttestationStatement\AttestationObjectLoader' => \Webauthn\AttestationStatement\AttestationObjectLoader::class, + 'Webauthn\AttestationStatement\AttestationStatementSupportManager' => \Webauthn\AttestationStatement\AttestationStatementSupportManager::class, + 'Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs' => \Webauthn\AuthenticationExtensions\AuthenticationExtensionsClientInputs::class, + 'Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler' => \Webauthn\AuthenticationExtensions\ExtensionOutputCheckerHandler::class, + 'Webauthn\AuthenticatorAssertionResponseValidator' => \Webauthn\AuthenticatorAssertionResponseValidator::class, + 'Webauthn\AuthenticatorAttestationResponseValidator' => \Webauthn\AuthenticatorAttestationResponseValidator::class, + 'Webauthn\AuthenticatorSelectionCriteria' => \DarkGhostHunter\Larapass\WebAuthn\AuthenticatorSelectionCriteria::class, + 'Webauthn\Counter\CounterChecker' => \Webauthn\Counter\ThrowExceptionIfInvalid::class, + 'Webauthn\PublicKeyCredentialLoader' => \Webauthn\PublicKeyCredentialLoader::class, + 'Webauthn\PublicKeyCredentialRpEntity' => \Webauthn\PublicKeyCredentialRpEntity::class, + 'Webauthn\PublicKeyCredentialSourceRepository' => \DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential::class, + 'Webauthn\TokenBinding\TokenBindingHandler' => \Webauthn\TokenBinding\IgnoreTokenBindingHandler::class, + 'auth' => \Illuminate\Auth\AuthManager::class, + 'auth.driver' => \Illuminate\Auth\SessionGuard::class, + 'blade.compiler' => \Illuminate\View\Compilers\BladeCompiler::class, + 'cache' => \Illuminate\Cache\CacheManager::class, + 'cache.psr6' => \Symfony\Component\Cache\Adapter\Psr16Adapter::class, + 'cache.store' => \Illuminate\Cache\Repository::class, + 'clockwork' => \Clockwork\Clockwork::class, + 'clockwork.authenticator' => \Clockwork\Authentication\NullAuthenticator::class, + 'clockwork.cache' => \Clockwork\DataSource\LaravelCacheDataSource::class, + 'clockwork.eloquent' => \Clockwork\DataSource\EloquentDataSource::class, + 'clockwork.events' => \Clockwork\DataSource\LaravelEventsDataSource::class, + 'clockwork.laravel' => \Clockwork\DataSource\LaravelDataSource::class, + 'clockwork.notifications' => \Clockwork\DataSource\LaravelNotificationsDataSource::class, + 'clockwork.queue' => \Clockwork\DataSource\LaravelQueueDataSource::class, + 'clockwork.redis' => \Clockwork\DataSource\LaravelRedisDataSource::class, + 'clockwork.request' => \Clockwork\Request\Request::class, + 'clockwork.storage' => \Clockwork\Storage\FileStorage::class, + 'clockwork.support' => \Clockwork\Support\Laravel\ClockworkSupport::class, + 'clockwork.swift' => \Clockwork\DataSource\SwiftDataSource::class, + 'clockwork.views' => \Clockwork\DataSource\LaravelViewsDataSource::class, + 'clockwork.xdebug' => \Clockwork\DataSource\XdebugDataSource::class, + 'command.auth.resets.clear' => \Illuminate\Auth\Console\ClearResetsCommand::class, + 'command.cache.clear' => \Illuminate\Cache\Console\ClearCommand::class, + 'command.cache.forget' => \Illuminate\Cache\Console\ForgetCommand::class, + 'command.cache.table' => \Illuminate\Cache\Console\CacheTableCommand::class, + 'command.cast.make' => \Illuminate\Foundation\Console\CastMakeCommand::class, + 'command.channel.make' => \Illuminate\Foundation\Console\ChannelMakeCommand::class, + 'command.clear-compiled' => \Illuminate\Foundation\Console\ClearCompiledCommand::class, + 'command.component.make' => \Illuminate\Foundation\Console\ComponentMakeCommand::class, + 'command.config.cache' => \Illuminate\Foundation\Console\ConfigCacheCommand::class, + 'command.config.clear' => \Illuminate\Foundation\Console\ConfigClearCommand::class, + 'command.console.make' => \Illuminate\Foundation\Console\ConsoleMakeCommand::class, + 'command.controller.make' => \Illuminate\Routing\Console\ControllerMakeCommand::class, + 'command.db.prune' => \Illuminate\Database\Console\PruneCommand::class, + 'command.db.wipe' => \Illuminate\Database\Console\WipeCommand::class, + 'command.debugbar.clear' => \Barryvdh\Debugbar\Console\ClearCommand::class, + 'command.down' => \Illuminate\Foundation\Console\DownCommand::class, + 'command.environment' => \Illuminate\Foundation\Console\EnvironmentCommand::class, + 'command.event.cache' => \Illuminate\Foundation\Console\EventCacheCommand::class, + 'command.event.clear' => \Illuminate\Foundation\Console\EventClearCommand::class, + 'command.event.generate' => \Illuminate\Foundation\Console\EventGenerateCommand::class, + 'command.event.list' => \Illuminate\Foundation\Console\EventListCommand::class, + 'command.event.make' => \Illuminate\Foundation\Console\EventMakeCommand::class, + 'command.exception.make' => \Illuminate\Foundation\Console\ExceptionMakeCommand::class, + 'command.factory.make' => \Illuminate\Database\Console\Factories\FactoryMakeCommand::class, + 'command.ide-helper.eloquent' => \Barryvdh\LaravelIdeHelper\Console\EloquentCommand::class, + 'command.ide-helper.generate' => \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand::class, + 'command.ide-helper.meta' => \Barryvdh\LaravelIdeHelper\Console\MetaCommand::class, + 'command.ide-helper.models' => \Barryvdh\LaravelIdeHelper\Console\ModelsCommand::class, + 'command.job.make' => \Illuminate\Foundation\Console\JobMakeCommand::class, + 'command.key.generate' => \Illuminate\Foundation\Console\KeyGenerateCommand::class, + 'command.listener.make' => \Illuminate\Foundation\Console\ListenerMakeCommand::class, + 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, + 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, + 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, + 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, + 'command.migrate.install' => \Illuminate\Database\Console\Migrations\InstallCommand::class, + 'command.migrate.make' => \Illuminate\Database\Console\Migrations\MigrateMakeCommand::class, + 'command.migrate.refresh' => \Illuminate\Database\Console\Migrations\RefreshCommand::class, + 'command.migrate.reset' => \Illuminate\Database\Console\Migrations\ResetCommand::class, + 'command.migrate.rollback' => \Illuminate\Database\Console\Migrations\RollbackCommand::class, + 'command.migrate.status' => \Illuminate\Database\Console\Migrations\StatusCommand::class, + 'command.model.make' => \Illuminate\Foundation\Console\ModelMakeCommand::class, + 'command.notification.make' => \Illuminate\Foundation\Console\NotificationMakeCommand::class, + 'command.notification.table' => \Illuminate\Notifications\Console\NotificationTableCommand::class, + 'command.observer.make' => \Illuminate\Foundation\Console\ObserverMakeCommand::class, + 'command.optimize' => \Illuminate\Foundation\Console\OptimizeCommand::class, + 'command.optimize.clear' => \Illuminate\Foundation\Console\OptimizeClearCommand::class, + 'command.package.discover' => \Illuminate\Foundation\Console\PackageDiscoverCommand::class, + 'command.policy.make' => \Illuminate\Foundation\Console\PolicyMakeCommand::class, + 'command.provider.make' => \Illuminate\Foundation\Console\ProviderMakeCommand::class, + 'command.queue.batches-table' => \Illuminate\Queue\Console\BatchesTableCommand::class, + 'command.queue.clear' => \Illuminate\Queue\Console\ClearCommand::class, + 'command.queue.failed' => \Illuminate\Queue\Console\ListFailedCommand::class, + 'command.queue.failed-table' => \Illuminate\Queue\Console\FailedTableCommand::class, + 'command.queue.flush' => \Illuminate\Queue\Console\FlushFailedCommand::class, + 'command.queue.forget' => \Illuminate\Queue\Console\ForgetFailedCommand::class, + 'command.queue.listen' => \Illuminate\Queue\Console\ListenCommand::class, + 'command.queue.monitor' => \Illuminate\Queue\Console\MonitorCommand::class, + 'command.queue.prune-batches' => \Illuminate\Queue\Console\PruneBatchesCommand::class, + 'command.queue.prune-failed-jobs' => \Illuminate\Queue\Console\PruneFailedJobsCommand::class, + 'command.queue.restart' => \Illuminate\Queue\Console\RestartCommand::class, + 'command.queue.retry' => \Illuminate\Queue\Console\RetryCommand::class, + 'command.queue.retry-batch' => \Illuminate\Queue\Console\RetryBatchCommand::class, + 'command.queue.table' => \Illuminate\Queue\Console\TableCommand::class, + 'command.queue.work' => \Illuminate\Queue\Console\WorkCommand::class, + 'command.request.make' => \Illuminate\Foundation\Console\RequestMakeCommand::class, + 'command.resource.make' => \Illuminate\Foundation\Console\ResourceMakeCommand::class, + 'command.route.cache' => \Illuminate\Foundation\Console\RouteCacheCommand::class, + 'command.route.clear' => \Illuminate\Foundation\Console\RouteClearCommand::class, + 'command.route.list' => \Illuminate\Foundation\Console\RouteListCommand::class, + 'command.rule.make' => \Illuminate\Foundation\Console\RuleMakeCommand::class, + 'command.schema.dump' => \Illuminate\Database\Console\DumpCommand::class, + 'command.seed' => \Illuminate\Database\Console\Seeds\SeedCommand::class, + 'command.seeder.make' => \Illuminate\Database\Console\Seeds\SeederMakeCommand::class, + 'command.serve' => \Illuminate\Foundation\Console\ServeCommand::class, + 'command.session.table' => \Illuminate\Session\Console\SessionTableCommand::class, + 'command.storage.link' => \Illuminate\Foundation\Console\StorageLinkCommand::class, + 'command.stub.publish' => \Illuminate\Foundation\Console\StubPublishCommand::class, + 'command.test.make' => \Illuminate\Foundation\Console\TestMakeCommand::class, + 'command.up' => \Illuminate\Foundation\Console\UpCommand::class, + 'command.vendor.publish' => \Illuminate\Foundation\Console\VendorPublishCommand::class, + 'command.view.cache' => \Illuminate\Foundation\Console\ViewCacheCommand::class, + 'command.view.clear' => \Illuminate\Foundation\Console\ViewClearCommand::class, + 'composer' => \Illuminate\Support\Composer::class, + 'cookie' => \Illuminate\Cookie\CookieJar::class, + 'db' => \Illuminate\Database\DatabaseManager::class, + 'db.connection' => \Illuminate\Database\MySqlConnection::class, + 'db.factory' => \Illuminate\Database\Connectors\ConnectionFactory::class, + 'db.transactions' => \Illuminate\Database\DatabaseTransactionsManager::class, + 'encrypter' => \Illuminate\Encryption\Encrypter::class, + 'events' => \Illuminate\Events\Dispatcher::class, + 'files' => \Illuminate\Filesystem\Filesystem::class, + 'filesystem' => \Illuminate\Filesystem\FilesystemManager::class, + 'filesystem.disk' => \Illuminate\Filesystem\FilesystemAdapter::class, + 'hash' => \Illuminate\Hashing\HashManager::class, + 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image-optimizer' => \Spatie\ImageOptimizer\OptimizerChain::class, + 'log' => \Illuminate\Log\LogManager::class, + 'mail.manager' => \Illuminate\Mail\MailManager::class, + 'mailer' => \Illuminate\Mail\Mailer::class, + 'memcached.connector' => \Illuminate\Cache\MemcachedConnector::class, + 'migration.creator' => \Illuminate\Database\Migrations\MigrationCreator::class, + 'migration.repository' => \Illuminate\Database\Migrations\DatabaseMigrationRepository::class, + 'migrator' => \Illuminate\Database\Migrations\Migrator::class, + 'queue' => \Illuminate\Queue\QueueManager::class, + 'queue.connection' => \Illuminate\Queue\SyncQueue::class, + 'queue.failer' => \Illuminate\Queue\Failed\DatabaseUuidFailedJobProvider::class, + 'queue.listener' => \Illuminate\Queue\Listener::class, + 'queue.worker' => \Illuminate\Queue\Worker::class, + 'redirect' => \Illuminate\Routing\Redirector::class, + 'redis' => \Illuminate\Redis\RedisManager::class, + 'router' => \Illuminate\Routing\Router::class, + 'session' => \Illuminate\Session\SessionManager::class, + 'session.store' => \Illuminate\Session\Store::class, + 'translation.loader' => \Illuminate\Translation\FileLoader::class, + 'translator' => \Illuminate\Translation\Translator::class, + 'url' => \Illuminate\Routing\UrlGenerator::class, + 'validation.presence' => \Illuminate\Validation\DatabasePresenceVerifier::class, + 'view' => \Illuminate\View\Factory::class, + 'view.engine.resolver' => \Illuminate\View\Engines\EngineResolver::class, + 'view.finder' => \Illuminate\View\FileViewFinder::class, +])); - override(\Illuminate\Support\Arr::add(0), type(0)); - override(\Illuminate\Support\Arr::except(0), type(0)); - override(\Illuminate\Support\Arr::first(0), elementType(0)); - override(\Illuminate\Support\Arr::last(0), elementType(0)); - override(\Illuminate\Support\Arr::get(0), elementType(0)); - override(\Illuminate\Support\Arr::only(0), type(0)); - override(\Illuminate\Support\Arr::prepend(0), type(0)); - override(\Illuminate\Support\Arr::pull(0), elementType(0)); - override(\Illuminate\Support\Arr::set(0), type(0)); - override(\Illuminate\Support\Arr::shuffle(0), type(0)); - override(\Illuminate\Support\Arr::sort(0), type(0)); - override(\Illuminate\Support\Arr::sortRecursive(0), type(0)); - override(\Illuminate\Support\Arr::where(0), type(0)); - override(\array_add(0), type(0)); - override(\array_except(0), type(0)); - override(\array_first(0), elementType(0)); - override(\array_last(0), elementType(0)); - override(\array_get(0), elementType(0)); - override(\array_only(0), type(0)); - override(\array_prepend(0), type(0)); - override(\array_pull(0), elementType(0)); - override(\array_set(0), type(0)); - override(\array_sort(0), type(0)); - override(\array_sort_recursive(0), type(0)); - override(\array_where(0), type(0)); - override(\head(0), elementType(0)); - override(\last(0), elementType(0)); - override(\with(0), type(0)); - override(\tap(0), type(0)); - override(\optional(0), type(0)); +override(\Illuminate\Support\Arr::add(0), type(0)); +override(\Illuminate\Support\Arr::except(0), type(0)); +override(\Illuminate\Support\Arr::first(0), elementType(0)); +override(\Illuminate\Support\Arr::last(0), elementType(0)); +override(\Illuminate\Support\Arr::get(0), elementType(0)); +override(\Illuminate\Support\Arr::only(0), type(0)); +override(\Illuminate\Support\Arr::prepend(0), type(0)); +override(\Illuminate\Support\Arr::pull(0), elementType(0)); +override(\Illuminate\Support\Arr::set(0), type(0)); +override(\Illuminate\Support\Arr::shuffle(0), type(0)); +override(\Illuminate\Support\Arr::sort(0), type(0)); +override(\Illuminate\Support\Arr::sortRecursive(0), type(0)); +override(\Illuminate\Support\Arr::where(0), type(0)); +override(\array_add(0), type(0)); +override(\array_except(0), type(0)); +override(\array_first(0), elementType(0)); +override(\array_last(0), elementType(0)); +override(\array_get(0), elementType(0)); +override(\array_only(0), type(0)); +override(\array_prepend(0), type(0)); +override(\array_pull(0), elementType(0)); +override(\array_set(0), type(0)); +override(\array_sort(0), type(0)); +override(\array_sort_recursive(0), type(0)); +override(\array_where(0), type(0)); +override(\head(0), elementType(0)); +override(\last(0), elementType(0)); +override(\with(0), type(0)); +override(\tap(0), type(0)); +override(\optional(0), type(0)); diff --git a/app/Actions/Album/Archive.php b/app/Actions/Album/Archive.php index 81ecaa2940..261ab61767 100644 --- a/app/Actions/Album/Archive.php +++ b/app/Actions/Album/Archive.php @@ -6,14 +6,17 @@ use App\Exceptions\ConfigurationKeyMissingException; use App\Exceptions\Handler; use App\Exceptions\Internal\FrameworkException; -use App\Facades\AccessControl; use App\Models\Album; use App\Models\Configs; use App\Models\Extensions\BaseAlbum; use App\Models\Photo; use App\Models\TagAlbum; +use App\Policies\AlbumPolicy; +use App\Policies\PhotoPolicy; use App\SmartAlbums\BaseSmartAlbum; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; use Safe\Exceptions\InfoException; use function Safe\ini_get; use function Safe\set_time_limit; @@ -188,8 +191,7 @@ private function compressAlbum(AbstractAlbum $album, array &$usedDirNames, ?stri // in smart albums should be owned by the current user... if ( ($album instanceof BaseSmartAlbum || $album instanceof TagAlbum) && - !AccessControl::is_current_user_or_admin($photo->owner_id) && - !($photo->album_id === null ? $album->is_downloadable : $photo->album->is_downloadable) + !Gate::check(PhotoPolicy::CAN_DOWNLOAD, $photo) ) { continue; } @@ -246,7 +248,7 @@ private static function isArchivable(AbstractAlbum $album): bool { return $album->is_downloadable || - ($album instanceof BaseSmartAlbum && AccessControl::is_logged_in()) || - ($album instanceof BaseAlbum && AccessControl::is_current_user_or_admin($album->owner_id)); + ($album instanceof BaseSmartAlbum && Auth::check()) || + ($album instanceof BaseAlbum && Gate::check(AlbumPolicy::IS_OWNER, $album)); } } diff --git a/app/Actions/Album/Create.php b/app/Actions/Album/Create.php index ece2b215ce..5f137f6882 100644 --- a/app/Actions/Album/Create.php +++ b/app/Actions/Album/Create.php @@ -3,8 +3,9 @@ namespace App\Actions\Album; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use App\Models\Album; +use Illuminate\Support\Facades\Auth; class Create extends Action { @@ -15,6 +16,7 @@ class Create extends Action * @return Album * * @throws ModelDBException + * @throws UnauthenticatedException */ public function create(string $title, ?Album $parentAlbum): Album { @@ -31,6 +33,8 @@ public function create(string $title, ?Album $parentAlbum): Album * * @param Album $album * @param Album|null $parentAlbum + * + * @throws UnauthenticatedException */ private function set_parent(Album $album, ?Album $parentAlbum): void { @@ -42,7 +46,9 @@ private function set_parent(Album $album, ?Album $parentAlbum): void // methods of the nested set `NodeTrait`. $album->appendToNode($parentAlbum); } else { - $album->owner_id = AccessControl::id(); + /** @var int */ + $userId = Auth::id() ?? throw new UnauthenticatedException(); + $album->owner_id = $userId; $album->makeRoot(); } } diff --git a/app/Actions/Album/CreateTagAlbum.php b/app/Actions/Album/CreateTagAlbum.php index 4f0b45c998..07a7eef8e6 100644 --- a/app/Actions/Album/CreateTagAlbum.php +++ b/app/Actions/Album/CreateTagAlbum.php @@ -3,8 +3,9 @@ namespace App\Actions\Album; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use App\Models\TagAlbum; +use Illuminate\Support\Facades\Auth; class CreateTagAlbum extends Action { @@ -17,13 +18,17 @@ class CreateTagAlbum extends Action * @return TagAlbum * * @throws ModelDBException + * @throws UnauthenticatedException */ public function create(string $title, array $show_tags): TagAlbum { + /** @var int */ + $userId = Auth::id() ?? throw new UnauthenticatedException(); + $album = new TagAlbum(); $album->title = $title; $album->show_tags = $show_tags; - $album->owner_id = AccessControl::id(); + $album->owner_id = $userId; $album->save(); return $album; diff --git a/app/Actions/Album/Delete.php b/app/Actions/Album/Delete.php index 6e0f558470..5f368b40e9 100644 --- a/app/Actions/Album/Delete.php +++ b/app/Actions/Album/Delete.php @@ -7,13 +7,17 @@ use App\Exceptions\Internal\LycheeAssertionError; use App\Exceptions\Internal\QueryBuilderException; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use App\Image\FileDeleter; use App\Models\Album; use App\Models\BaseAlbumImpl; use App\Models\TagAlbum; +use App\Policies\UserPolicy; use App\SmartAlbums\UnsortedAlbum; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Database\Query\Builder as BaseBuilder; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; use Safe\Exceptions\ArrayException; use function Safe\usort; @@ -58,6 +62,8 @@ class Delete extends Action * @return FileDeleter contains the collected files which became obsolete * * @throws ModelDBException + * @throws ModelNotFoundException + * @throws UnauthenticatedException */ public function do(array $albumIDs): FileDeleter { @@ -69,8 +75,8 @@ public function do(array $albumIDs): FileDeleter // because it provides deletion of photos if (in_array(UnsortedAlbum::ID, $albumIDs, true)) { $query = UnsortedAlbum::getInstance()->photos(); - if (!AccessControl::is_admin()) { - $query->where('owner_id', '=', AccessControl::id()); + if (!Gate::check(UserPolicy::IS_ADMIN)) { + $query->where('owner_id', '=', Auth::id() ?? throw new UnauthenticatedException()); } $unsortedPhotoIDs = $query->pluck('id')->all(); } diff --git a/app/Actions/Album/SetProtectionPolicy.php b/app/Actions/Album/SetProtectionPolicy.php index 51be56ea54..288fd871d8 100644 --- a/app/Actions/Album/SetProtectionPolicy.php +++ b/app/Actions/Album/SetProtectionPolicy.php @@ -8,6 +8,7 @@ use App\Exceptions\ModelDBException; use App\Models\Extensions\BaseAlbum; use Illuminate\Contracts\Container\BindingResolutionException; +use Illuminate\Support\Facades\Hash; /** * Class SetProtectionPolicy. @@ -41,9 +42,7 @@ public function do(BaseAlbum $album, AlbumProtectionPolicy $protectionPolicy, bo if ($password !== null) { // password is not null => we update the value with the hash try { - $album->password = bcrypt($password); - } catch (\InvalidArgumentException $e) { - throw new InvalidPropertyException('Could not hash password', $e); + $album->password = Hash::make($password); } catch (BindingResolutionException $e) { throw new FrameworkException('Laravel\'s hashing component', $e); } diff --git a/app/Actions/Album/Unlock.php b/app/Actions/Album/Unlock.php index 7075e4da9b..aebb337fce 100644 --- a/app/Actions/Album/Unlock.php +++ b/app/Actions/Album/Unlock.php @@ -2,20 +2,20 @@ namespace App\Actions\Album; -use App\Actions\AlbumAuthorisationProvider; use App\Exceptions\UnauthorizedException; use App\Models\BaseAlbumImpl; use App\Models\Extensions\BaseAlbum; +use App\Policies\AlbumPolicy; use Illuminate\Support\Facades\Hash; class Unlock extends Action { - private AlbumAuthorisationProvider $albumAuthorisationProvider; + private AlbumPolicy $albumPolicy; public function __construct() { parent::__construct(); - $this->albumAuthorisationProvider = resolve(AlbumAuthorisationProvider::class); + $this->albumPolicy = resolve(AlbumPolicy::class); } /** @@ -35,7 +35,7 @@ public function do(BaseAlbum $album, string $password): void if ( $album->password === null || $album->password === '' || - $this->albumAuthorisationProvider->isUnlocked($album) + $this->albumPolicy->isUnlocked($album) ) { return; } @@ -67,7 +67,7 @@ private function propagate(string $password): void /** @var BaseAlbumImpl $album */ foreach ($albums as $album) { if (Hash::check($password, $album->password)) { - $this->albumAuthorisationProvider->unlock($album); + $this->albumPolicy->unlock($album); } } } diff --git a/app/Actions/Albums/PositionData.php b/app/Actions/Albums/PositionData.php index 10a96ec3a7..4c140146ff 100644 --- a/app/Actions/Albums/PositionData.php +++ b/app/Actions/Albums/PositionData.php @@ -2,22 +2,22 @@ namespace App\Actions\Albums; -use App\Actions\PhotoAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\PositionData as PositionDataDTO; use App\Models\Configs; use App\Models\Photo; use App\Models\SizeVariant; +use App\Policies\PhotoQueryPolicy; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; class PositionData { - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected PhotoQueryPolicy $photoQueryPolicy; - public function __construct(PhotoAuthorisationProvider $photoAuthorisationProvider) + public function __construct(PhotoQueryPolicy $photoQueryPolicy) { - $this->photoAuthorisationProvider = $photoAuthorisationProvider; + $this->photoQueryPolicy = $photoQueryPolicy; // caching to avoid further request Configs::get(); } @@ -31,7 +31,7 @@ public function __construct(PhotoAuthorisationProvider $photoAuthorisationProvid */ public function do(): PositionDataDTO { - $photoQuery = $this->photoAuthorisationProvider->applySearchabilityFilter( + $photoQuery = $this->photoQueryPolicy->applySearchabilityFilter( Photo::query() ->with([ 'album' => function (BelongsTo $b) { diff --git a/app/Actions/Albums/Top.php b/app/Actions/Albums/Top.php index 48af34e076..b71631ba4d 100644 --- a/app/Actions/Albums/Top.php +++ b/app/Actions/Albums/Top.php @@ -2,33 +2,37 @@ namespace App\Actions\Albums; -use App\Actions\AlbumAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\AlbumSortingCriterion; use App\DTO\TopAlbums; +use App\Exceptions\ConfigurationKeyMissingException; use App\Exceptions\Internal\InvalidOrderDirectionException; -use App\Facades\AccessControl; use App\Factories\AlbumFactory; use App\Models\Album; use App\Models\Extensions\SortingDecorator; use App\Models\TagAlbum; +use App\Policies\AlbumPolicy; +use App\Policies\AlbumQueryPolicy; use App\SmartAlbums\BaseSmartAlbum; use Illuminate\Support\Collection; use Illuminate\Support\Collection as BaseCollection; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; use Kalnoy\Nestedset\QueryBuilder as NsQueryBuilder; class Top { - private AlbumAuthorisationProvider $albumAuthorisationProvider; + private AlbumQueryPolicy $albumQueryPolicy; private AlbumFactory $albumFactory; private AlbumSortingCriterion $sorting; /** * @throws InvalidOrderDirectionException + * @throws ConfigurationKeyMissingException */ - public function __construct(AlbumFactory $albumFactory, AlbumAuthorisationProvider $albumAuthorisationProvider) + public function __construct(AlbumFactory $albumFactory, AlbumQueryPolicy $albumQueryPolicy) { - $this->albumAuthorisationProvider = $albumAuthorisationProvider; + $this->albumQueryPolicy = $albumQueryPolicy; $this->albumFactory = $albumFactory; $this->sorting = AlbumSortingCriterion::createDefault(); } @@ -60,10 +64,10 @@ public function get(): TopAlbums $smartAlbums = $this->albumFactory ->getAllBuiltInSmartAlbums(false) ->map( - fn ($smartAlbum) => $this->albumAuthorisationProvider->isVisible($smartAlbum) ? $smartAlbum : null + fn ($smartAlbum) => Gate::check(AlbumPolicy::IS_VISIBLE, $smartAlbum) ? $smartAlbum : null ); - $tagAlbumQuery = $this->albumAuthorisationProvider + $tagAlbumQuery = $this->albumQueryPolicy ->applyVisibilityFilter(TagAlbum::query()); /** @var Collection $tagAlbums */ $tagAlbums = (new SortingDecorator($tagAlbumQuery)) @@ -71,22 +75,22 @@ public function get(): TopAlbums ->get(); /** @var NsQueryBuilder $query */ - $query = $this->albumAuthorisationProvider + $query = $this->albumQueryPolicy ->applyVisibilityFilter(Album::query()->whereIsRoot()); - if (AccessControl::is_logged_in()) { + $userID = Auth::id(); + if ($userID !== null) { // For authenticated users we group albums by ownership. $albums = (new SortingDecorator($query)) ->orderBy('owner_id') ->orderBy($this->sorting->column, $this->sorting->order) ->get(); - $id = AccessControl::id(); /** * @var BaseCollection $a * @var BaseCollection $b */ - list($a, $b) = $albums->partition(fn ($album) => $album->owner_id === $id); + list($a, $b) = $albums->partition(fn ($album) => $album->owner_id === $userID); return new TopAlbums($smartAlbums, $tagAlbums, $a->values(), $b->values()); } else { diff --git a/app/Actions/Albums/Tree.php b/app/Actions/Albums/Tree.php index 4c5537e3a2..d09d3cf26a 100644 --- a/app/Actions/Albums/Tree.php +++ b/app/Actions/Albums/Tree.php @@ -2,27 +2,29 @@ namespace App\Actions\Albums; -use App\Actions\AlbumAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\AlbumSortingCriterion; use App\DTO\AlbumTree; +use App\Exceptions\ConfigurationKeyMissingException; use App\Exceptions\Internal\InvalidOrderDirectionException; -use App\Facades\AccessControl; use App\Models\Album; use App\Models\Extensions\SortingDecorator; +use App\Policies\AlbumQueryPolicy; +use Illuminate\Support\Facades\Auth; use Kalnoy\Nestedset\Collection as NsCollection; class Tree { - private AlbumAuthorisationProvider $albumAuthorisationProvider; + private AlbumQueryPolicy $albumQueryPolicy; private AlbumSortingCriterion $sorting; /** * @throws InvalidOrderDirectionException + * @throws ConfigurationKeyMissingException */ - public function __construct(AlbumAuthorisationProvider $albumAuthorisationProvider) + public function __construct(AlbumQueryPolicy $albumQueryPolicy) { - $this->albumAuthorisationProvider = $albumAuthorisationProvider; + $this->albumQueryPolicy = $albumQueryPolicy; $this->sorting = AlbumSortingCriterion::createDefault(); } @@ -35,23 +37,23 @@ public function get(): AlbumTree { /* * Note, strictly speaking - * {@link AlbumAuthorisationProvider::applyBrowsabilityFilter()} + * {@link AlbumQueryPolicy::applyBrowsabilityFilter()} * would be the correct function in order to scope the query below, * because we only want albums which are browsable. * But - * {@link AlbumAuthorisationProvider::applyBrowsabilityFilter()} + * {@link AlbumQueryPolicy::applyBrowsabilityFilter()} * is rather slow for large sets of albums (O(n²) runtime). * Luckily, - * {@link AlbumAuthorisationProvider::applyReachabilityFilter()} + * {@link AlbumQueryPolicy::applyReachabilityFilter()} * is sufficient here, although it does only consider an album's * reachability _locally_. * We rely on `->toTree` below to remove orphaned sub-tress and hence * only return a tree of browsable albums. */ $query = new SortingDecorator( - $this->albumAuthorisationProvider->applyReachabilityFilter(Album::query()) + $this->albumQueryPolicy->applyReachabilityFilter(Album::query()) ); - if (AccessControl::is_logged_in()) { + if (Auth::check()) { // For authenticated users we group albums by ownership. $query->orderBy('owner_id'); } @@ -61,8 +63,8 @@ public function get(): AlbumTree $albums = $query->get(); /** @var ?NsCollection $sharedAlbums */ $sharedAlbums = null; - if (AccessControl::is_logged_in()) { - $id = AccessControl::id(); + $userID = Auth::id(); + if ($userID !== null) { // ATTENTION: // For this to work correctly, it is crucial that all child albums // below each top-level album have the same owner! @@ -70,7 +72,7 @@ public function get(): AlbumTree // (sub)-tree and then `toTree` will return garbage as it does // not find connected paths within `$albums` or `$sharedAlbums`, // resp. - list($albums, $sharedAlbums) = $albums->partition(fn ($album) => $album->owner_id === $id); + list($albums, $sharedAlbums) = $albums->partition(fn ($album) => $album->owner_id === $userID); } // We must explicitly pass `null` as the ID of the root album diff --git a/app/Actions/Photo/Strategies/AddBaseStrategy.php b/app/Actions/Photo/Strategies/AddBaseStrategy.php index d8538b35cb..bb03ba46b9 100644 --- a/app/Actions/Photo/Strategies/AddBaseStrategy.php +++ b/app/Actions/Photo/Strategies/AddBaseStrategy.php @@ -4,8 +4,9 @@ use App\Exceptions\MediaFileOperationException; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use App\Models\Photo; +use Illuminate\Support\Facades\Auth; abstract class AddBaseStrategy { @@ -99,6 +100,9 @@ protected function hydrateMetadata(): void } } + /** + * @throws UnauthenticatedException + */ protected function setParentAndOwnership(): void { if ($this->parameters->album !== null) { @@ -112,7 +116,9 @@ protected function setParentAndOwnership(): void // Avoid unnecessary DB request, when we access the album of a // photo later (e.g. when a notification is sent). $this->photo->setRelation('album', null); - $this->photo->owner_id = AccessControl::id(); + /** @var int */ + $userId = Auth::id() ?? throw new UnauthenticatedException(); + $this->photo->owner_id = $userId; } } } diff --git a/app/Actions/RSS/Generate.php b/app/Actions/RSS/Generate.php index 5e851c9c93..05b442822e 100644 --- a/app/Actions/RSS/Generate.php +++ b/app/Actions/RSS/Generate.php @@ -2,11 +2,11 @@ namespace App\Actions\RSS; -use App\Actions\PhotoAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\Exceptions\Internal\FrameworkException; use App\Models\Configs; use App\Models\Photo; +use App\Policies\PhotoQueryPolicy; use Carbon\Exceptions\InvalidFormatException; use Carbon\Exceptions\UnitException; use Illuminate\Support\Carbon; @@ -15,11 +15,11 @@ class Generate { - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected PhotoQueryPolicy $photoQueryPolicy; - public function __construct(PhotoAuthorisationProvider $photoAuthorisationProvider) + public function __construct(PhotoQueryPolicy $photoQueryPolicy) { - $this->photoAuthorisationProvider = $photoAuthorisationProvider; + $this->photoQueryPolicy = $photoQueryPolicy; } private function create_link_to_page(Photo $photo_model): string @@ -65,7 +65,7 @@ public function do(): Collection throw new FrameworkException('Date/Time component (Carbon)', $e); } - $photos = $this->photoAuthorisationProvider + $photos = $this->photoQueryPolicy ->applySearchabilityFilter( Photo::with(['album', 'owner', 'size_variants', 'size_variants.sym_links']) ) diff --git a/app/Actions/Search/AlbumSearch.php b/app/Actions/Search/AlbumSearch.php index 4c02800207..1403415b64 100644 --- a/app/Actions/Search/AlbumSearch.php +++ b/app/Actions/Search/AlbumSearch.php @@ -2,7 +2,6 @@ namespace App\Actions\Search; -use App\Actions\AlbumAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\AlbumSortingCriterion; use App\Exceptions\Internal\QueryBuilderException; @@ -11,15 +10,16 @@ use App\Models\Extensions\SortingDecorator; use App\Models\Extensions\TagAlbumBuilder; use App\Models\TagAlbum; +use App\Policies\AlbumQueryPolicy; use Illuminate\Database\Eloquent\Collection; class AlbumSearch { - protected AlbumAuthorisationProvider $albumAuthorisationProvider; + protected AlbumQueryPolicy $albumQueryPolicy; - public function __construct(AlbumAuthorisationProvider $albumAuthorisationProvider) + public function __construct(AlbumQueryPolicy $albumQueryPolicy) { - $this->albumAuthorisationProvider = $albumAuthorisationProvider; + $this->albumQueryPolicy = $albumQueryPolicy; } /** @@ -33,7 +33,7 @@ public function queryTagAlbums(array $terms): Collection { // Note: `applyVisibilityFilter` already adds a JOIN clause with `base_albums`. // No need to add a second JOIN clause. - $albumQuery = $this->albumAuthorisationProvider->applyVisibilityFilter( + $albumQuery = $this->albumQueryPolicy->applyVisibilityFilter( TagAlbum::query() ); $this->addSearchCondition($terms, $albumQuery); @@ -58,7 +58,7 @@ public function queryAlbums(array $terms): Collection ->select(['albums.*']) ->join('base_albums', 'base_albums.id', '=', 'albums.id'); $this->addSearchCondition($terms, $albumQuery); - $this->albumAuthorisationProvider->applyBrowsabilityFilter($albumQuery); + $this->albumQueryPolicy->applyBrowsabilityFilter($albumQuery); $sorting = AlbumSortingCriterion::createDefault(); diff --git a/app/Actions/Search/PhotoSearch.php b/app/Actions/Search/PhotoSearch.php index 56516ba847..508fdc1567 100644 --- a/app/Actions/Search/PhotoSearch.php +++ b/app/Actions/Search/PhotoSearch.php @@ -2,21 +2,21 @@ namespace App\Actions\Search; -use App\Actions\PhotoAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\PhotoSortingCriterion; use App\Models\Extensions\FixedQueryBuilder; use App\Models\Extensions\SortingDecorator; use App\Models\Photo; +use App\Policies\PhotoQueryPolicy; use Illuminate\Database\Eloquent\Collection; class PhotoSearch { - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected PhotoQueryPolicy $photoQueryPolicy; - public function __construct(PhotoAuthorisationProvider $photoAuthorisationProvider) + public function __construct(PhotoQueryPolicy $photoQueryPolicy) { - $this->photoAuthorisationProvider = $photoAuthorisationProvider; + $this->photoQueryPolicy = $photoQueryPolicy; } /** @@ -24,7 +24,7 @@ public function __construct(PhotoAuthorisationProvider $photoAuthorisationProvid */ public function query(array $terms): Collection { - $query = $this->photoAuthorisationProvider->applySearchabilityFilter( + $query = $this->photoQueryPolicy->applySearchabilityFilter( Photo::with(['album', 'size_variants', 'size_variants.sym_links']) ); diff --git a/app/Actions/Settings/Login.php b/app/Actions/Settings/Login.php deleted file mode 100644 index 8f98dee916..0000000000 --- a/app/Actions/Settings/Login.php +++ /dev/null @@ -1,127 +0,0 @@ - 4.0.8 - /** @var User $adminUser */ - $adminUser = User::query()->find(0); - if ($adminUser->password === '' && $adminUser->username === '') { - $adminUser->username = $hashedUsername; - $adminUser->password = $hashedPassword; - $adminUser->save(); - AccessControl::login($adminUser); - - return; - } - - if (AccessControl::is_admin()) { - if ($adminUser->password === '' || Hash::check($oldPassword, $adminUser->password)) { - $adminUser->username = $hashedUsername; - $adminUser->password = $hashedPassword; - $adminUser->save(); - unset($adminUser); - - return; - } - unset($adminUser); - - throw new UnauthenticatedException('Password is invalid'); - } - - // is this necessary ? - if (AccessControl::is_logged_in()) { - $id = AccessControl::id(); - - // this is probably sensitive to timing attacks... - /** @var User $user */ - $user = User::query()->findOrFail($id); - - if ($user->is_locked) { - Logs::notice(__METHOD__, __LINE__, 'Locked user (' . $user->username . ') tried to change their identity from ' . $ip); - throw new UnauthorizedException('Account is locked'); - } - - if (User::query()->where('username', '=', $username)->where('id', '!=', $id)->count() !== 0) { - Logs::notice(__METHOD__, __LINE__, 'User (' . $user->username . ') tried to change their identity to ' . $username . ' from ' . $ip); - throw new ConflictingPropertyException('Username already exists.'); - } - - // TODO: This looks suspicious. - // Users can only change the username/password of their own - // account and must be authenticated in order to do so. - // (See above, we use `AccessControl::id()` and query for the - // currently authenticated user). - // The user name of the currently authenticated user is visible on - // the GUI anyway. - // Why do we re-check whether users have been able to correctly - // present their current (aka old) username again? - // This does not seem to make any sense security-wise. - if ($user->username === $oldUsername && Hash::check($oldPassword, $user->password)) { - Logs::notice(__METHOD__, __LINE__, 'User (' . $user->username . ') changed their identity for (' . $username . ') from ' . $ip); - $user->username = $username; - $user->password = $hashedPassword; - $user->save(); - - return; - } - Logs::notice(__METHOD__, __LINE__, 'User (' . $user->username . ') tried to change their identity from ' . $ip); - - throw new UnauthenticatedException('Previous username or password are invalid'); - } - } -} diff --git a/app/Actions/Settings/SetLogin.php b/app/Actions/Settings/SetLogin.php new file mode 100644 index 0000000000..58c713ddd3 --- /dev/null +++ b/app/Actions/Settings/SetLogin.php @@ -0,0 +1,34 @@ +findOrFail(0); + $adminUser->username = $username; + $adminUser->password = Hash::make($password); + $adminUser->save(); + + return $adminUser; + } +} diff --git a/app/Actions/Settings/UpdateLogin.php b/app/Actions/Settings/UpdateLogin.php new file mode 100644 index 0000000000..6c77a2950b --- /dev/null +++ b/app/Actions/Settings/UpdateLogin.php @@ -0,0 +1,57 @@ +password)) { + Logs::notice(__METHOD__, __LINE__, 'User (' . $user->username . ') tried to change their identity from ' . $ip); + + throw new UnauthenticatedException('Previous password is invalid'); + } + + if (User::query()->where('username', '=', $username)->where('id', '!=', $user->id)->count() !== 0) { + Logs::notice(__METHOD__, __LINE__, 'User (' . $user->username . ') tried to change their identity to ' . $username . ' from ' . $ip); + throw new ConflictingPropertyException('Username already exists.'); + } + + if ($username !== null && $username !== $user->username) { + Logs::notice(__METHOD__, __LINE__, 'User (' . $user->username . ') changed their identity for (' . $username . ') from ' . $ip); + $user->username = $username; + } + + $user->password = Hash::make($password); + $user->save(); + + return $user; + } +} diff --git a/app/Actions/User/Create.php b/app/Actions/User/Create.php index 09f043d3a9..adb19763ee 100644 --- a/app/Actions/User/Create.php +++ b/app/Actions/User/Create.php @@ -6,6 +6,7 @@ use App\Exceptions\InvalidPropertyException; use App\Exceptions\ModelDBException; use App\Models\User; +use Illuminate\Support\Facades\Hash; class Create { @@ -18,15 +19,11 @@ public function do(string $username, string $password, bool $mayUpload, bool $is if (User::query()->where('username', '=', $username)->count() !== 0) { throw new ConflictingPropertyException('Username already exists'); } - try { - $user = new User(); - $user->may_upload = $mayUpload; - $user->is_locked = $isLocked; - $user->username = $username; - $user->password = bcrypt($password); - } catch (\InvalidArgumentException $e) { - throw new InvalidPropertyException('Could not hash password', $e); - } + $user = new User(); + $user->may_upload = $mayUpload; + $user->is_locked = $isLocked; + $user->username = $username; + $user->password = Hash::make($password); $user->save(); return $user; diff --git a/app/Actions/User/Notify.php b/app/Actions/User/Notify.php index d614c6764d..a1b2eeba19 100644 --- a/app/Actions/User/Notify.php +++ b/app/Actions/User/Notify.php @@ -2,12 +2,12 @@ namespace App\Actions\User; -use App\Facades\AccessControl; use App\Models\Configs; use App\Models\Photo; use App\Models\User; use App\Notifications\PhotoAdded; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Notification; class Notify @@ -29,7 +29,7 @@ public function do(Photo $photo): void $users = $users ->unique('id', true) ->whereNotNull('email') - ->where('id', '!=', AccessControl::id()); + ->where('id', '!=', Auth::id()); Notification::send($users, new PhotoAdded($photo)); } diff --git a/app/Actions/User/ResetAdmin.php b/app/Actions/User/ResetAdmin.php new file mode 100644 index 0000000000..fea10a2ff8 --- /dev/null +++ b/app/Actions/User/ResetAdmin.php @@ -0,0 +1,30 @@ +findOrNew(0); + $user->incrementing = false; // disable auto-generation of ID + $user->id = 0; + $user->username = ''; + $user->password = ''; + $user->save(); + } +} diff --git a/app/Actions/User/Save.php b/app/Actions/User/Save.php index 3d52fe9d99..7626393f13 100644 --- a/app/Actions/User/Save.php +++ b/app/Actions/User/Save.php @@ -7,6 +7,7 @@ use App\Exceptions\ModelDBException; use App\Http\Requests\Traits\HasPasswordTrait; use App\Models\User; +use Illuminate\Support\Facades\Hash; class Save { @@ -37,7 +38,7 @@ public function do(User $user, string $username, ?string $password, bool $mayUpl $user->is_locked = $isLocked; if ($password !== null) { try { - $user->password = bcrypt($password); + $user->password = Hash::make($password); } catch (\InvalidArgumentException $e) { throw new InvalidPropertyException('Could not hash password'); } diff --git a/app/Actions/WebAuth/Delete.php b/app/Actions/WebAuth/Delete.php index 803d97849c..3767d55b77 100644 --- a/app/Actions/WebAuth/Delete.php +++ b/app/Actions/WebAuth/Delete.php @@ -2,13 +2,19 @@ namespace App\Actions\WebAuth; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; +use App\Models\User; +use Illuminate\Support\Facades\Auth; class Delete { + /** + * @throws UnauthenticatedException + */ public function do(string|array $ids): void { - $user = AccessControl::user(); + /** @var User $user */ + $user = Auth::user() ?? throw new UnauthenticatedException(); $user->removeCredential($ids); } } diff --git a/app/Actions/WebAuth/GenerateRegistration.php b/app/Actions/WebAuth/GenerateRegistration.php index 1319f12949..7a79d53447 100644 --- a/app/Actions/WebAuth/GenerateRegistration.php +++ b/app/Actions/WebAuth/GenerateRegistration.php @@ -2,14 +2,21 @@ namespace App\Actions\WebAuth; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use DarkGhostHunter\Larapass\Facades\WebAuthn; +use Illuminate\Support\Facades\Auth; use Webauthn\PublicKeyCredentialCreationOptions; class GenerateRegistration { + /** + * @throws UnauthenticatedException + */ public function do(): PublicKeyCredentialCreationOptions { - return WebAuthn::generateAttestation(AccessControl::user()); + /** @var \App\Models\User */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + + return WebAuthn::generateAttestation($user); } } diff --git a/app/Actions/WebAuth/Lists.php b/app/Actions/WebAuth/Lists.php index ec80d275cc..1417f87753 100644 --- a/app/Actions/WebAuth/Lists.php +++ b/app/Actions/WebAuth/Lists.php @@ -2,13 +2,20 @@ namespace App\Actions\WebAuth; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Auth; class Lists { + /** + * @throws UnauthenticatedException + */ public function do(): Collection { - return AccessControl::user()->webAuthnCredentials->map(fn ($cred) => ['id' => $cred->id]); + /** @var \App\Models\User */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + + return $user->webAuthnCredentials->map(fn ($cred) => ['id' => $cred->id]); } } diff --git a/app/Actions/WebAuth/VerifyAuthentication.php b/app/Actions/WebAuth/VerifyAuthentication.php index aefc629445..fb5034f78c 100644 --- a/app/Actions/WebAuth/VerifyAuthentication.php +++ b/app/Actions/WebAuth/VerifyAuthentication.php @@ -4,9 +4,9 @@ use App\Exceptions\Internal\InvalidUserIdException; use App\Exceptions\UnauthenticatedException; -use App\Facades\AccessControl; use App\Models\User; use DarkGhostHunter\Larapass\Facades\WebAuthn; +use Illuminate\Support\Facades\Auth; use function Safe\base64_decode; class VerifyAuthentication @@ -27,7 +27,7 @@ public function do(array $credential): void if ($success) { $user = $this->getUserFromCredentials($credential); if ($user !== null) { - AccessControl::login($user); + Auth::login($user); return; } diff --git a/app/Actions/WebAuth/VerifyRegistration.php b/app/Actions/WebAuth/VerifyRegistration.php index 41cbd118a4..4bc98db7a2 100644 --- a/app/Actions/WebAuth/VerifyRegistration.php +++ b/app/Actions/WebAuth/VerifyRegistration.php @@ -2,14 +2,16 @@ namespace App\Actions\WebAuth; +use App\Exceptions\UnauthenticatedException; use App\Exceptions\UnauthorizedException; -use App\Facades\AccessControl; use App\Models\User; use DarkGhostHunter\Larapass\Facades\WebAuthn; +use Illuminate\Support\Facades\Auth; class VerifyRegistration { /** + * @throws UnauthenticatedException * @throws UnauthorizedException */ public function do(array $data): void @@ -17,7 +19,7 @@ public function do(array $data): void /** * @var User */ - $user = AccessControl::user(); + $user = Auth::user() ?? throw new UnauthenticatedException(); // okay. /** @var false|\Webauthn\PublicKeyCredentialSource */ diff --git a/app/Console/Commands/Ghostbuster.php b/app/Console/Commands/Ghostbuster.php index aa1110957e..fe5031dbe7 100644 --- a/app/Console/Commands/Ghostbuster.php +++ b/app/Console/Commands/Ghostbuster.php @@ -74,7 +74,7 @@ public function handle(): int $dryrun = filter_var($this->option('dryrun'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) !== false; $uploadDisk = SizeVariantNamingStrategy::getImageDisk(); $symlinkDisk = Storage::disk(SymLink::DISK_NAME); - $isLocalDisk = ($uploadDisk->getDriver()->getAdapter() instanceof LocalFlysystem); + $isLocalDisk = $uploadDisk->getDriver()->getAdapter() instanceof LocalFlysystem; $this->line(''); diff --git a/app/Console/Commands/ResetAdmin.php b/app/Console/Commands/ResetAdmin.php index ccf5c46ae5..f01b0c5452 100644 --- a/app/Console/Commands/ResetAdmin.php +++ b/app/Console/Commands/ResetAdmin.php @@ -2,12 +2,11 @@ namespace App\Console\Commands; +use App\Actions\User\ResetAdmin as UserResetAdmin; use App\Console\Commands\Utilities\Colorize; use App\Contracts\ExternalLycheeException; use App\Exceptions\Internal\QueryBuilderException; use App\Exceptions\UnexpectedException; -use App\Legacy\Legacy; -use App\Models\User; use Illuminate\Console\Command; use Symfony\Component\Console\Exception\ExceptionInterface as SymfonyConsoleException; @@ -32,15 +31,23 @@ class ResetAdmin extends Command */ protected $description = 'Reset Login and Password of the admin user.'; + /** + * Access to the reset admin function. + * + * @var UserResetAdmin + */ + protected UserResetAdmin $userResetAdmin; + /** * Create a new command instance. * * @throws SymfonyConsoleException */ - public function __construct(Colorize $colorize) + public function __construct(Colorize $colorize, UserResetAdmin $userResetAdmin) { parent::__construct(); $this->col = $colorize; + $this->userResetAdmin = $userResetAdmin; } /** @@ -53,15 +60,7 @@ public function __construct(Colorize $colorize) public function handle(): int { try { - Legacy::resetAdmin(); - - /** @var User $user */ - $user = User::query()->findOrNew(0); - $user->incrementing = false; // disable auto-generation of ID - $user->id = 0; - $user->username = ''; - $user->password = ''; - $user->save(); + $this->userResetAdmin->do(); $this->line($this->col->yellow('Admin username and password reset.')); diff --git a/app/Console/Commands/Sync.php b/app/Console/Commands/Sync.php index 4e3774f91e..8f3c292191 100644 --- a/app/Console/Commands/Sync.php +++ b/app/Console/Commands/Sync.php @@ -7,11 +7,11 @@ use App\Contracts\ExternalLycheeException; use App\Exceptions\ConfigurationKeyMissingException; use App\Exceptions\UnexpectedException; -use App\Facades\AccessControl; use App\Models\Album; use App\Models\Configs; use Exception; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Auth; use function Safe\sprintf; use Symfony\Component\Console\Exception\ExceptionInterface as SymfonyConsoleException; @@ -110,7 +110,7 @@ public function handle(): int 0 ); - AccessControl::log_as_id($owner_id); + Auth::loginUsingId($owner_id); $this->info('Start syncing.'); diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index ee6a3d454b..284976c83c 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -9,6 +9,7 @@ use App\Exceptions\Handlers\MigrationHandler; use App\Exceptions\Handlers\NoEncryptionKey; use App\Models\Logs; +use Illuminate\Auth\AuthenticationException; use Illuminate\Contracts\Container\Container; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Session\TokenMismatchException; @@ -68,37 +69,87 @@ public function __construct(Container $container) * {@link Handler::renderHttpException()}, * {@link Handler::convertExceptionToArray()}. * - * We overwrite this method such that {@link TokenMismatchException} - * is not replaced by a generic HTTP exception but something more - * specific, which we can detect more easily. - * Note, that the default Laravel handler has actually **two** methods - * which both replace exceptions by other exceptions: + * We overwrite this method to wrap the following exception into proper + * HTTP exceptions which masquerades them and avoids that the framework + * handles them in special ways: + * + * - {@link TokenMismatchException} + * - {@link AuthenticationException} + * + * Note, that the default Laravel handler actually replaces exceptions by + * other exception at **three** places. + * The method {@link ExceptionHandler::render()} is the entry point for + * exception handling. + * This method calls * * - {@link ExceptionHandler::mapException()} * - {@link ExceptionHandler::prepareException()} * - * which are chained one after the other like this + * in that order which both replace exceptions. + * Finally, the parent method {@link ExceptionHandler::render()} also + * replaces some exceptions, too. + * We hook into the earliest of the three methods, i.e. `mapException`. + * + * **`TokenMismatchException`** + * + * Per default, the framework eventually replaces + * {@link TokenMismatchException} by generic HTTP exception in + * {@link ExceptionHandler::prepareException()}. + * We want to keep it more specific in order to detect this kind of + * exception more easily in the frontend. * - * $e = $this->prepareException($this->mapException($e)); + * **`AuthenticationException`** * - * in {@link ExceptionHandler::render()}. - * Indeed, it is the second method - * {@link ExceptionHandler::prepareException()} - * which replaces {@link TokenMismatchException} by a generic HTTP - * exception. - * We hook into the earlier method to prevent this. + * Per default, the framework replaces {@link AuthenticationException} + * by a redirection to the route `login` in + * {@link ExceptionHandler::render()}. + * This is problematic for various reasons: + * + * 1. We do not really have a dedicated login page to which users + * could be redirected. + * Our login dialog is implemented in JavaScript. + * Surely, we could use the main page `/gallery` as a redirection + * target, but it would probably confuse people to be redirected there + * without obvious reason. + * 2. In theory, all requests for content type `text/html` should always + * succeed. + * Any interaction which might trigger an authorization error is done + * via JavaScript and JSON requests. + * If an authorization error occurs for an HTML request, this indicates + * a programming error. + * In this case we want to be informed about that, and we want users + * to tell us so, instead of suppressing the error by silent + * redirection (cp. previous point). + * Moreover, such an event always implies that the backend and the + * frontend are out-of-sync with respect to the authentication state. + * The backend considers the session to be unauthenticated while the + * frontend considers the user still to be authenticated. + * In particular, users could not even login again, even if the knew + * what was going on, because the frontend did not provide the option + * to do so. + * Hence, we are in an unrecoverable situation anyway. + * 3. For JSON requests, we want the structure of the JSON response to + * match our error reporting scheme as defined by + * {@link Handler::convertExceptionToArray} such that the frontend + * can properly interpret and display it. + * By default, the framework would return a JSON response whose format + * is unique to the {@link AuthenticationException}. * * @param \Throwable $e * * @return \Throwable */ - protected function mapException(\Throwable $e) + protected function mapException(\Throwable $e): \Throwable { if ($e instanceof TokenMismatchException) { return new SessionExpiredException(SessionExpiredException::DEFAULT_MESSAGE, $e); } - return parent::mapException($e); // TODO: Change the autogenerated stub + if ($e instanceof AuthenticationException) { + return new UnauthenticatedException(UnauthenticatedException::DEFAULT_MESSAGE, $e); + } + + return parent::mapException($e); } /** diff --git a/app/Exceptions/PasswordRequiredException.php b/app/Exceptions/PasswordRequiredException.php index 9db1d854cb..39b85ab2aa 100644 --- a/app/Exceptions/PasswordRequiredException.php +++ b/app/Exceptions/PasswordRequiredException.php @@ -2,7 +2,7 @@ namespace App\Exceptions; -use App\Facades\AccessControl; +use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; /** @@ -21,6 +21,6 @@ class PasswordRequiredException extends LycheeBaseException public function __construct(string $msg = self::DEFAULT_MESSAGE, \Throwable $previous = null) { - parent::__construct(AccessControl::is_logged_in() ? Response::HTTP_FORBIDDEN : Response::HTTP_UNAUTHORIZED, $msg, $previous); + parent::__construct(Auth::check() ? Response::HTTP_FORBIDDEN : Response::HTTP_UNAUTHORIZED, $msg, $previous); } } diff --git a/app/Facades/AccessControl.php b/app/Facades/AccessControl.php deleted file mode 100644 index b26401f2d3..0000000000 --- a/app/Facades/AccessControl.php +++ /dev/null @@ -1,37 +0,0 @@ -do( + $request->username(), + $request->password() + ); + // Update the session with the new credentials of the user. + // Otherwise, the session is out-of-sync and falsely assumes the user + // to be unauthenticated upon the next request. + Auth::login($adminUser); + } + + /** + * Update the Login information of the current user. * * @param ChangeLoginRequest $request - * @param Login $login + * @param UpdateLogin $updateLogin * * @return void * * @throws LycheeException * @throws ModelNotFoundException */ - public function setLogin(ChangeLoginRequest $request, Login $login): void + public function updateLogin(ChangeLoginRequest $request, UpdateLogin $updateLogin): void { - $login->do( + $currentUser = $updateLogin->do( $request->username(), $request->password(), - $request->oldUsername(), $request->oldPassword(), $request->ip() ); + // Update the session with the new credentials of the user. + // Otherwise, the session is out-of-sync and falsely assumes the user + // to be unauthenticated upon the next request. + Auth::login($currentUser); } /** diff --git a/app/Http/Controllers/Administration/SharingController.php b/app/Http/Controllers/Administration/SharingController.php index 3efa77c163..c9f6846ddf 100644 --- a/app/Http/Controllers/Administration/SharingController.php +++ b/app/Http/Controllers/Administration/SharingController.php @@ -5,14 +5,17 @@ use App\Actions\Sharing\ListShare; use App\DTO\Shares; use App\Exceptions\Internal\QueryBuilderException; +use App\Exceptions\UnauthenticatedException; use App\Exceptions\UnauthorizedException; -use App\Facades\AccessControl; use App\Http\Requests\Sharing\DeleteSharingRequest; use App\Http\Requests\Sharing\SetSharingRequest; use App\Models\User; +use App\Policies\UserPolicy; use Illuminate\Database\Eloquent\Collection; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Gate; class SharingController extends Controller { @@ -24,17 +27,22 @@ class SharingController extends Controller * @return Shares * * @throws QueryBuilderException + * @throws UnauthenticatedException * @throws UnauthorizedException */ public function list(ListShare $listShare): Shares { + /** @var int */ + $userId = Auth::id() ?? throw new UnauthenticatedException(); + + // TODO: move this to Request authorization. // Note: This test is part of the request validation for the other // methods of this class. - if (!AccessControl::can_upload()) { + if (!Gate::check(UserPolicy::CAN_UPLOAD, User::class)) { throw new UnauthorizedException('Upload privilege required'); } - return $listShare->do(AccessControl::id()); + return $listShare->do($userId); } /** diff --git a/app/Http/Controllers/Administration/UpdateController.php b/app/Http/Controllers/Administration/UpdateController.php index 35f28ea1f6..99be5c8510 100644 --- a/app/Http/Controllers/Administration/UpdateController.php +++ b/app/Http/Controllers/Administration/UpdateController.php @@ -6,9 +6,15 @@ use App\Actions\Update\Check as CheckUpdate; use App\Contracts\LycheeException; use App\Exceptions\VersionControlException; -use App\Facades\AccessControl; +use App\Legacy\AdminAuthentication; +use App\Legacy\Legacy; +use App\Policies\UserPolicy; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Session; use Illuminate\View\View; /** @@ -117,23 +123,36 @@ public function view(): View * The whole code around installation/upgrade/migration should * thoroughly be revised an refactored. */ - public function migrate(Request $request): View + public function migrate(Request $request): View|Response { - if ( - AccessControl::is_admin() || AccessControl::noLogin() || - AccessControl::log_as_admin($request['username'] ?? '', $request['password'] ?? '', $request->ip()) - ) { + // This conditional code makes use of lazy boolean evaluation: a || b does not execute b if a is true. + // 1. Check whether the user is already logged in properly + // 2. Check if the admin user is registered and login as admin, if not + // 3. Attempt to login as an admin user using the legacy method: hash(username) + hash(password). + // 4. Try to login the normal way. + // + // TODO: Step 2 will become unnecessary once admin registration has become part of the installation routine; after that the case that no admin is registered cannot occur anymore + // TODO: Step 3 will become unnecessary once the admin user of any existing installation has at least logged in once and the admin user has therewith migrated to use a non-hashed user name + $isLoggedIn = Auth::check(); + $isLoggedIn = $isLoggedIn || AdminAuthentication::loginAsAdminIfNotRegistered(); + $isLoggedIn = $isLoggedIn || AdminAuthentication::loginAsAdmin($request->input('username', ''), $request->input('password', ''), $request->ip()); + $isLoggedIn = $isLoggedIn || Auth::attempt(['username' => $request->input('username', ''), 'password' => $request->input('password', '')]); + + // Check if logged in AND is admin + if (Gate::check(UserPolicy::IS_ADMIN)) { $output = []; $this->applyUpdate->migrate($output); $this->applyUpdate->filter($output); - if (AccessControl::noLogin()) { - AccessControl::logout(); + if (AdminAuthentication::isAdminNotRegistered()) { + Auth::logout(); + Session::flush(); } return view('update.results', ['code' => '200', 'message' => 'Migration results', 'output' => $output]); - } else { - return view('update.error', ['code' => '403', 'message' => 'Incorrect username or password']); } + + // Rather than returning a view directly (which implies code 200, we use response in order to ensure code 403) + return response()->view('update.error', ['code' => '403', 'message' => 'Incorrect username or password'], 403); } } diff --git a/app/Http/Controllers/Administration/UserController.php b/app/Http/Controllers/Administration/UserController.php index b24900e4aa..ef4c6d18e5 100644 --- a/app/Http/Controllers/Administration/UserController.php +++ b/app/Http/Controllers/Administration/UserController.php @@ -9,7 +9,7 @@ use App\Exceptions\Internal\QueryBuilderException; use App\Exceptions\InvalidPropertyException; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use App\Http\Requests\User\AddUserRequest; use App\Http\Requests\User\DeleteUserRequest; use App\Http\Requests\User\SetEmailRequest; @@ -17,6 +17,7 @@ use App\Models\User; use Illuminate\Database\Eloquent\Collection; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Auth; class UserController extends Controller { @@ -100,11 +101,14 @@ public function create(AddUserRequest $request, Create $create): User * * @throws InternalLycheeException * @throws ModelDBException + * @throws UnauthenticatedException */ public function setEmail(SetEmailRequest $request): void { try { - $user = AccessControl::user(); + /** @var User $user */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + $user->email = $request->email(); if ($request->email() === null) { @@ -123,11 +127,16 @@ public function setEmail(SetEmailRequest $request): void * TODO: Why is this an independent request? IMHO this should be combined with the GET request for the other user settings (see session init) * * @return array{email: ?string} + * + * @throws UnauthenticatedException */ public function getEmail(): array { + /** @var User $user */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + return [ - 'email' => AccessControl::user()->email, + 'email' => $user->email, ]; } } diff --git a/app/Http/Controllers/PhotoController.php b/app/Http/Controllers/PhotoController.php index 53c5406db0..c26d64748e 100644 --- a/app/Http/Controllers/PhotoController.php +++ b/app/Http/Controllers/PhotoController.php @@ -13,7 +13,6 @@ use App\Exceptions\MediaFileOperationException; use App\Exceptions\ModelDBException; use App\Exceptions\UnauthorizedException; -use App\Facades\AccessControl; use App\Http\Requests\Photo\AddPhotoRequest; use App\Http\Requests\Photo\ArchivePhotosRequest; use App\Http\Requests\Photo\DeletePhotosRequest; @@ -31,11 +30,13 @@ use App\ModelFunctions\SymLinkFunctions; use App\Models\Configs; use App\Models\Photo; +use App\Policies\UserPolicy; use App\SmartAlbums\StarredAlbum; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Routing\Controller; use Illuminate\Support\Collection; use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Gate; use Symfony\Component\HttpFoundation\Response as SymfonyResponse; class PhotoController extends Controller @@ -328,7 +329,7 @@ public function getArchive(ArchivePhotosRequest $request, Archive $archive): Sym */ public function clearSymLink(): void { - if (!AccessControl::is_admin()) { + if (!Gate::check(UserPolicy::IS_ADMIN)) { throw new UnauthorizedException('Admin privileges required'); } $this->symLinkFunctions->clearSymLink(); diff --git a/app/Http/Controllers/SessionController.php b/app/Http/Controllers/SessionController.php index a5435759e0..5c157be3c8 100644 --- a/app/Http/Controllers/SessionController.php +++ b/app/Http/Controllers/SessionController.php @@ -2,22 +2,27 @@ namespace App\Http\Controllers; +use App\Contracts\LycheeException; use App\DTO\AlbumSortingCriterion; use App\DTO\PhotoSortingCriterion; +use App\Exceptions\Internal\FrameworkException; +use App\Exceptions\ModelDBException; use App\Exceptions\UnauthenticatedException; -use App\Exceptions\VersionControlException; -use App\Facades\AccessControl; use App\Facades\Helpers; use App\Facades\Lang; use App\Http\Requests\Session\LoginRequest; +use App\Legacy\AdminAuthentication; use App\Metadata\GitHubFunctions; use App\ModelFunctions\ConfigFunctions; use App\Models\Configs; use App\Models\Logs; use App\Models\User; -use Illuminate\Database\Eloquent\ModelNotFoundException; +use App\Policies\UserPolicy; +use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Session; class SessionController extends Controller @@ -54,77 +59,69 @@ public function __construct(ConfigFunctions $configFunctions, GitHubFunctions $g * * @return array * - * @throws ModelNotFoundException - * @throws VersionControlException + * @throws LycheeException */ public function init(): array { - $logged_in = AccessControl::is_logged_in(); + try { + // Return settings + $return = []; - // Return settings - $return = []; - - // Check if login credentials exist and login if they don't - if (AccessControl::noLogin() === true || $logged_in === true) { - // we set the user ID (it is set to 0 if there is no login/password = admin) - $user_id = AccessControl::id(); - - if ($user_id === 0) { - $return['status'] = Config::get('defines.status.LYCHEE_STATUS_LOGGEDIN'); - $return['admin'] = true; - $return['may_upload'] = true; // not necessary - - $return['config'] = $this->configFunctions->admin(); - - $return['config']['location'] = base_path('public/'); - } else { - try { + // Check if login credentials exist and login if they don't + if (Auth::check() || AdminAuthentication::loginAsAdminIfNotRegistered()) { + if (Gate::check(UserPolicy::IS_ADMIN)) { + $return['status'] = Config::get('defines.status.LYCHEE_STATUS_LOGGEDIN'); + $return['admin'] = true; + $return['may_upload'] = true; // not necessary + $return['config'] = $this->configFunctions->admin(); + $return['config']['location'] = base_path('public/'); + } else { /** @var User $user */ - $user = User::query()->findOrFail($user_id); + $user = Auth::user() ?? throw new UnauthenticatedException(); + $return['status'] = Config::get('defines.status.LYCHEE_STATUS_LOGGEDIN'); $return['config'] = $this->configFunctions->public(); $return['is_locked'] = $user->is_locked; // may user change their password? $return['may_upload'] = $user->may_upload; // may user upload? $return['username'] = $user->username; - } catch (ModelNotFoundException $e) { - $this->logout(); - throw $e; } - } - // here we say whether we logged in because there is no login/password or if we actually entered a login/password - // TODO: Refactor this. At least, rename the flag `login` to something more understandable, like `isAdminUserConfigured`, but rather re-factor the whole logic, i.e. creating the initial user should be part of the installation routine. - $return['config']['login'] = $logged_in; - $return['config']['lang_available'] = Lang::get_lang_available(); - } else { - // Logged out - $return['config'] = $this->configFunctions->public(); - if (Configs::getValueAsBool('hide_version_number')) { - $return['config']['version'] = ''; + // here we say whether we logged in because there is no login/password or if we actually entered a login/password + // TODO: Refactor this. At least, rename the flag `login` to something more understandable, like `isAdminUserConfigured`, but rather re-factor the whole logic, i.e. creating the initial user should be part of the installation routine. + $return['config']['login'] = !AdminAuthentication::isAdminNotRegistered(); + $return['config']['lang_available'] = Lang::get_lang_available(); + } else { + // Logged out + $return['config'] = $this->configFunctions->public(); + if (Configs::getValueAsBool('hide_version_number')) { + $return['config']['version'] = ''; + } + $return['status'] = Config::get('defines.status.LYCHEE_STATUS_LOGGEDOUT'); } - $return['status'] = Config::get('defines.status.LYCHEE_STATUS_LOGGEDOUT'); - } - // Consolidate sorting attributes - $return['config']['sorting_albums'] = AlbumSortingCriterion::createDefault()->toArray(); - $return['config']['sorting_photos'] = PhotoSortingCriterion::createDefault()->toArray(); - unset($return['config']['sorting_albums_col']); - unset($return['config']['sorting_albums_order']); - unset($return['config']['sorting_photos_col']); - unset($return['config']['sorting_photos_order']); + // Consolidate sorting attributes + $return['config']['sorting_albums'] = AlbumSortingCriterion::createDefault()->toArray(); + $return['config']['sorting_photos'] = PhotoSortingCriterion::createDefault()->toArray(); + unset($return['config']['sorting_albums_col']); + unset($return['config']['sorting_albums_order']); + unset($return['config']['sorting_photos_col']); + unset($return['config']['sorting_photos_order']); - // Device dependent settings - $deviceType = Helpers::getDeviceType(); - // UI behaviour needs to be slightly modified if client is a TV - $return['config_device'] = $this->configFunctions->get_config_device($deviceType); + // Device dependent settings + $deviceType = Helpers::getDeviceType(); + // UI behaviour needs to be slightly modified if client is a TV + $return['config_device'] = $this->configFunctions->get_config_device($deviceType); - // we also return the local - $return['locale'] = Lang::get_lang(); + // we also return the local + $return['locale'] = Lang::get_lang(); - $return['update_json'] = 0; - $return['update_available'] = false; + $return['update_json'] = 0; + $return['update_available'] = false; - return array_merge($return, $this->gitHubFunctions->checkUpdates()); + return array_merge($return, $this->gitHubFunctions->checkUpdates()); + } catch (BindingResolutionException) { + throw new FrameworkException('Laravel\'s path component'); + } } /** @@ -135,22 +132,24 @@ public function init(): array * @return void * * @throws UnauthenticatedException + * @throws ModelDBException */ public function login(LoginRequest $request): void { // No login - if (AccessControl::noLogin() === true) { + if (AdminAuthentication::loginAsAdminIfNotRegistered()) { Logs::warning(__METHOD__, __LINE__, 'DEFAULT LOGIN!'); return; } - // this is probably sensitive to timing attacks... - if (AccessControl::log_as_admin($request->username(), $request->password(), $request->ip()) === true) { + if (AdminAuthentication::loginAsAdmin($request->username(), $request->password(), $request->ip())) { return; } - if (AccessControl::log_as_user($request->username(), $request->password(), $request->ip()) === true) { + if (Auth::attempt(['username' => $request->username(), 'password' => $request->password()])) { + Logs::notice(__METHOD__, __LINE__, 'User (' . $request->username() . ') has logged in from ' . $request->ip()); + return; } @@ -167,16 +166,7 @@ public function login(LoginRequest $request): void */ public function logout(): void { + Auth::logout(); Session::flush(); } - - /** - * Shows the session values. - * - * @return void - */ - public function show(): void - { - dd(Session::all()); - } } diff --git a/app/Http/Livewire/Sidebar.php b/app/Http/Livewire/Sidebar.php index 18354ddd96..f133ac8789 100644 --- a/app/Http/Livewire/Sidebar.php +++ b/app/Http/Livewire/Sidebar.php @@ -2,7 +2,6 @@ namespace App\Http\Livewire; -use App\Facades\AccessControl; use App\Facades\Lang; use App\Models\Album; use App\Models\Photo; @@ -96,7 +95,7 @@ public function generateAlbumStructure() $this->data = [$basic, $album, $license]; - if (AccessControl::is_logged_in()) { + if (Auth::check()) { $this->data[] = $share; } } diff --git a/app/Http/Middleware/AdminCheck.php b/app/Http/Middleware/AdminCheck.php index 05c79472ad..6b80beab15 100644 --- a/app/Http/Middleware/AdminCheck.php +++ b/app/Http/Middleware/AdminCheck.php @@ -4,10 +4,11 @@ use App\Contracts\InternalLycheeException; use App\Exceptions\UnauthorizedException; -use App\Facades\AccessControl; use App\Http\Middleware\Checks\IsInstalled; +use App\Policies\UserPolicy; use Closure; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; class AdminCheck { @@ -35,7 +36,7 @@ public function handle(Request $request, Closure $next): mixed return $next($request); } - if (!AccessControl::is_admin()) { + if (!Gate::check(UserPolicy::IS_ADMIN)) { throw new UnauthorizedException('Admin privileges required'); } diff --git a/app/Http/Requests/Album/AddAlbumRequest.php b/app/Http/Requests/Album/AddAlbumRequest.php index 852b2c9ce7..5691427927 100644 --- a/app/Http/Requests/Album/AddAlbumRequest.php +++ b/app/Http/Requests/Album/AddAlbumRequest.php @@ -2,14 +2,17 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasParentAlbum; use App\Http\Requests\Contracts\HasTitle; use App\Http\Requests\Traits\HasParentAlbumTrait; use App\Http\Requests\Traits\HasTitleTrait; use App\Models\Album; +use App\Policies\AlbumPolicy; use App\Rules\RandomIDRule; use App\Rules\TitleRule; +use Illuminate\Support\Facades\Gate; class AddAlbumRequest extends BaseApiRequest implements HasTitle, HasParentAlbum { @@ -21,7 +24,7 @@ class AddAlbumRequest extends BaseApiRequest implements HasTitle, HasParentAlbum */ public function authorize(): bool { - return $this->authorizeAlbumWrite($this->parentAlbum); + return Gate::check(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $this->parentAlbum]); } /** diff --git a/app/Http/Requests/Album/AddTagAlbumRequest.php b/app/Http/Requests/Album/AddTagAlbumRequest.php index 12e6e36b49..5ab4f5dcea 100644 --- a/app/Http/Requests/Album/AddTagAlbumRequest.php +++ b/app/Http/Requests/Album/AddTagAlbumRequest.php @@ -2,12 +2,15 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasTags; use App\Http\Requests\Contracts\HasTitle; use App\Http\Requests\Traits\HasTagsTrait; use App\Http\Requests\Traits\HasTitleTrait; +use App\Policies\AlbumPolicy; use App\Rules\TitleRule; +use Illuminate\Support\Facades\Gate; class AddTagAlbumRequest extends BaseApiRequest implements HasTitle, HasTags { @@ -22,7 +25,7 @@ public function authorize(): bool // Sic! // Tag albums can only be created below the root album which has the // ID `null`. - return $this->authorizeAlbumWrite(null); + return Gate::check(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, null]); } /** diff --git a/app/Http/Requests/Album/ArchiveAlbumsRequest.php b/app/Http/Requests/Album/ArchiveAlbumsRequest.php index 71705e9ab9..20d9a82919 100644 --- a/app/Http/Requests/Album/ArchiveAlbumsRequest.php +++ b/app/Http/Requests/Album/ArchiveAlbumsRequest.php @@ -2,10 +2,13 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAlbums; use App\Http\Requests\Traits\HasAlbumsTrait; +use App\Policies\AlbumPolicy; use App\Rules\AlbumIDListRule; +use Illuminate\Support\Facades\Gate; /** * @implements HasAlbums<\App\Contracts\AbstractAlbum> @@ -19,7 +22,14 @@ class ArchiveAlbumsRequest extends BaseApiRequest implements HasAlbums */ public function authorize(): bool { - return $this->authorizeAlbumsAccess($this->albums); + /** @var AbstractAlbum $album */ + foreach ($this->albums as $album) { + if (!Gate::check(AlbumPolicy::CAN_ACCESS, $album)) { + return false; + } + } + + return true; } /** diff --git a/app/Http/Requests/Album/DeleteAlbumsRequest.php b/app/Http/Requests/Album/DeleteAlbumsRequest.php index 32a3c8956b..851ab6f246 100644 --- a/app/Http/Requests/Album/DeleteAlbumsRequest.php +++ b/app/Http/Requests/Album/DeleteAlbumsRequest.php @@ -5,7 +5,10 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAlbumIDs; use App\Http\Requests\Traits\HasAlbumIDsTrait; +use App\Models\Album; +use App\Policies\AlbumPolicy; use App\Rules\AlbumIDRule; +use Illuminate\Support\Facades\Gate; class DeleteAlbumsRequest extends BaseApiRequest implements HasAlbumIDs { @@ -16,7 +19,7 @@ class DeleteAlbumsRequest extends BaseApiRequest implements HasAlbumIDs */ public function authorize(): bool { - return $this->authorizeAlbumsWriteByIDs($this->albumIDs); + return Gate::check(AlbumPolicy::CAN_EDIT_ID, [Album::class, $this->albumIDs()]); } /** diff --git a/app/Http/Requests/Album/DeleteTrackRequest.php b/app/Http/Requests/Album/DeleteTrackRequest.php index a42baefc2c..c0f6bcd625 100644 --- a/app/Http/Requests/Album/DeleteTrackRequest.php +++ b/app/Http/Requests/Album/DeleteTrackRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Models\Album; use App\Rules\AlbumIDRule; @@ -12,14 +13,7 @@ class DeleteTrackRequest extends BaseApiRequest implements HasAlbum { use HasAlbumTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } + use AuthorizeCanEditAlbumTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Album/GetAlbumPositionDataRequest.php b/app/Http/Requests/Album/GetAlbumPositionDataRequest.php index 49b221c6df..8d4575a195 100644 --- a/app/Http/Requests/Album/GetAlbumPositionDataRequest.php +++ b/app/Http/Requests/Album/GetAlbumPositionDataRequest.php @@ -2,10 +2,13 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Traits\HasAbstractAlbumTrait; +use App\Policies\AlbumPolicy; use App\Rules\AlbumIDRule; +use Illuminate\Support\Facades\Gate; class GetAlbumPositionDataRequest extends BaseApiRequest implements HasAbstractAlbum { @@ -20,7 +23,7 @@ class GetAlbumPositionDataRequest extends BaseApiRequest implements HasAbstractA */ public function authorize(): bool { - return $this->authorizeAlbumAccess($this->album); + return Gate::check(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $this->album]); } /** diff --git a/app/Http/Requests/Album/GetAlbumRequest.php b/app/Http/Requests/Album/GetAlbumRequest.php index 62d7ef861e..25b8356172 100644 --- a/app/Http/Requests/Album/GetAlbumRequest.php +++ b/app/Http/Requests/Album/GetAlbumRequest.php @@ -2,12 +2,15 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Exceptions\PasswordRequiredException; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Traits\HasAbstractAlbumTrait; use App\Models\Extensions\BaseAlbum; +use App\Policies\AlbumPolicy; use App\Rules\AlbumIDRule; +use Illuminate\Support\Facades\Gate; class GetAlbumRequest extends BaseApiRequest implements HasAbstractAlbum { @@ -18,7 +21,7 @@ class GetAlbumRequest extends BaseApiRequest implements HasAbstractAlbum */ public function authorize(): bool { - $result = $this->authorizeAlbumAccess($this->album); + $result = Gate::check(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $this->album]); // In case of a password protected album, we must throw an exception // with a special error message ("Password required") such that the diff --git a/app/Http/Requests/Album/MergeAlbumsRequest.php b/app/Http/Requests/Album/MergeAlbumsRequest.php index 7a2e6be2cf..52f6ccd6aa 100644 --- a/app/Http/Requests/Album/MergeAlbumsRequest.php +++ b/app/Http/Requests/Album/MergeAlbumsRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; use App\Http\Requests\Contracts\HasAlbums; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumAlbumsTrait; use App\Http\Requests\Traits\HasAlbumsTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Models\Album; @@ -19,15 +20,7 @@ class MergeAlbumsRequest extends BaseApiRequest implements HasAlbum, HasAlbums use HasAlbumTrait; /** @phpstan-use HasAlbumsTrait */ use HasAlbumsTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album) && - $this->authorizeAlbumsWrite($this->albums); - } + use AuthorizeCanEditAlbumAlbumsTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Album/MoveAlbumsRequest.php b/app/Http/Requests/Album/MoveAlbumsRequest.php index 31c324fc17..d11e1a9280 100644 --- a/app/Http/Requests/Album/MoveAlbumsRequest.php +++ b/app/Http/Requests/Album/MoveAlbumsRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; use App\Http\Requests\Contracts\HasAlbums; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumAlbumsTrait; use App\Http\Requests\Traits\HasAlbumsTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Models\Album; @@ -19,15 +20,7 @@ class MoveAlbumsRequest extends BaseApiRequest implements HasAlbum, HasAlbums use HasAlbumTrait; /** @phpstan-use HasAlbumsTrait */ use HasAlbumsTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album) && - $this->authorizeAlbumsWrite($this->albums); - } + use AuthorizeCanEditAlbumAlbumsTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Album/SetAlbumCoverRequest.php b/app/Http/Requests/Album/SetAlbumCoverRequest.php index b87080cc1e..2d926cb2e5 100644 --- a/app/Http/Requests/Album/SetAlbumCoverRequest.php +++ b/app/Http/Requests/Album/SetAlbumCoverRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; @@ -10,7 +11,10 @@ use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Album; use App\Models\Photo; +use App\Policies\AlbumPolicy; +use App\Policies\PhotoPolicy; use App\Rules\RandomIDRule; +use Illuminate\Support\Facades\Gate; class SetAlbumCoverRequest extends BaseApiRequest implements HasAlbum, HasPhoto { @@ -22,8 +26,7 @@ class SetAlbumCoverRequest extends BaseApiRequest implements HasAlbum, HasPhoto */ public function authorize(): bool { - return $this->authorizeAlbumWrite($this->album) && - $this->authorizePhotoVisible($this->photo); + return Gate::check(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $this->album]) && Gate::check(PhotoPolicy::IS_VISIBLE, $this->photo); } /** diff --git a/app/Http/Requests/Album/SetAlbumDescriptionRequest.php b/app/Http/Requests/Album/SetAlbumDescriptionRequest.php index 8340d349ad..717c2a9fa1 100644 --- a/app/Http/Requests/Album/SetAlbumDescriptionRequest.php +++ b/app/Http/Requests/Album/SetAlbumDescriptionRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasBaseAlbum; use App\Http\Requests\Contracts\HasDescription; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasBaseAlbumTrait; use App\Http\Requests\Traits\HasDescriptionTrait; use App\Rules\DescriptionRule; @@ -15,14 +16,7 @@ class SetAlbumDescriptionRequest extends BaseApiRequest implements HasBaseAlbum, { use HasBaseAlbumTrait; use HasDescriptionTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } + use AuthorizeCanEditAlbumTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Album/SetAlbumLicenseRequest.php b/app/Http/Requests/Album/SetAlbumLicenseRequest.php index f34198b705..d4cf93a1cd 100644 --- a/app/Http/Requests/Album/SetAlbumLicenseRequest.php +++ b/app/Http/Requests/Album/SetAlbumLicenseRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; use App\Http\Requests\Contracts\HasLicense; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Http\Requests\Traits\HasLicenseTrait; use App\Models\Album; @@ -16,14 +17,7 @@ class SetAlbumLicenseRequest extends BaseApiRequest implements HasAlbum, HasLice { use HasAlbumTrait; use HasLicenseTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } + use AuthorizeCanEditAlbumTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Album/SetAlbumNSFWRequest.php b/app/Http/Requests/Album/SetAlbumNSFWRequest.php index 995a83d39e..9034b8449a 100644 --- a/app/Http/Requests/Album/SetAlbumNSFWRequest.php +++ b/app/Http/Requests/Album/SetAlbumNSFWRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasBaseAlbum; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasBaseAlbumTrait; use App\Rules\RandomIDRule; @@ -14,18 +15,12 @@ class SetAlbumNSFWRequest extends BaseApiRequest implements HasBaseAlbum { use HasBaseAlbumTrait; + use AuthorizeCanEditAlbumTrait; + public const IS_NSFW_ATTRIBUTE = 'is_nsfw'; protected bool $isNSFW = false; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Album/SetAlbumProtectionPolicyRequest.php b/app/Http/Requests/Album/SetAlbumProtectionPolicyRequest.php index b3f6abe801..3bbf362aeb 100644 --- a/app/Http/Requests/Album/SetAlbumProtectionPolicyRequest.php +++ b/app/Http/Requests/Album/SetAlbumProtectionPolicyRequest.php @@ -7,6 +7,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasBaseAlbum; use App\Http\Requests\Contracts\HasPassword; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasBaseAlbumTrait; use App\Http\Requests\Traits\HasPasswordTrait; use App\Rules\PasswordRule; @@ -16,18 +17,11 @@ class SetAlbumProtectionPolicyRequest extends BaseApiRequest implements HasBaseA { use HasBaseAlbumTrait; use HasPasswordTrait; + use AuthorizeCanEditAlbumTrait; protected bool $isPasswordProvided; protected AlbumProtectionPolicy $albumAccessSettings; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Album/SetAlbumSortingRequest.php b/app/Http/Requests/Album/SetAlbumSortingRequest.php index bf08130c45..3ee935cd24 100644 --- a/app/Http/Requests/Album/SetAlbumSortingRequest.php +++ b/app/Http/Requests/Album/SetAlbumSortingRequest.php @@ -7,6 +7,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasBaseAlbum; use App\Http\Requests\Contracts\HasSortingCriterion; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasBaseAlbumTrait; use App\Http\Requests\Traits\HasSortingCriterionTrait; use App\Rules\OrderRule; @@ -17,14 +18,7 @@ class SetAlbumSortingRequest extends BaseApiRequest implements HasBaseAlbum, Has { use HasBaseAlbumTrait; use HasSortingCriterionTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } + use AuthorizeCanEditAlbumTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Album/SetAlbumTagsRequest.php b/app/Http/Requests/Album/SetAlbumTagsRequest.php index 4ca707eee0..c0e6c42cc5 100644 --- a/app/Http/Requests/Album/SetAlbumTagsRequest.php +++ b/app/Http/Requests/Album/SetAlbumTagsRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasTagAlbum; use App\Http\Requests\Contracts\HasTags; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasTagAlbumTrait; use App\Http\Requests\Traits\HasTagsTrait; use App\Models\TagAlbum; @@ -15,6 +16,7 @@ class SetAlbumTagsRequest extends BaseApiRequest implements HasTagAlbum, HasTags { use HasTagAlbumTrait; use HasTagsTrait; + use AuthorizeCanEditAlbumTrait; /** * For historical reasons the parameter of the API is called `show_tags` @@ -22,14 +24,6 @@ class SetAlbumTagsRequest extends BaseApiRequest implements HasTagAlbum, HasTags */ public const SHOW_TAGS_ATTRIBUTE = 'show_tags'; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Album/SetAlbumTrackRequest.php b/app/Http/Requests/Album/SetAlbumTrackRequest.php index 3532a1475a..0864015172 100644 --- a/app/Http/Requests/Album/SetAlbumTrackRequest.php +++ b/app/Http/Requests/Album/SetAlbumTrackRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Models\Album; use App\Rules\AlbumIDRule; @@ -13,18 +14,11 @@ class SetAlbumTrackRequest extends BaseApiRequest implements HasAlbum { use HasAlbumTrait; + use AuthorizeCanEditAlbumTrait; public const FILE_ATTRIBUTE = 'file'; public UploadedFile $file; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Album/SetAlbumsTitleRequest.php b/app/Http/Requests/Album/SetAlbumsTitleRequest.php index 655322de07..2afd148a8c 100644 --- a/app/Http/Requests/Album/SetAlbumsTitleRequest.php +++ b/app/Http/Requests/Album/SetAlbumsTitleRequest.php @@ -2,14 +2,17 @@ namespace App\Http\Requests\Album; +use App\Contracts\AbstractAlbum; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAlbums; use App\Http\Requests\Contracts\HasTitle; use App\Http\Requests\Traits\HasAlbumsTrait; use App\Http\Requests\Traits\HasTitleTrait; use App\Models\Extensions\BaseAlbum; +use App\Policies\AlbumPolicy; use App\Rules\RandomIDRule; use App\Rules\TitleRule; +use Illuminate\Support\Facades\Gate; /** * @implements HasAlbums @@ -24,7 +27,14 @@ class SetAlbumsTitleRequest extends BaseApiRequest implements HasTitle, HasAlbum */ public function authorize(): bool { - return $this->authorizeAlbumsWrite($this->albums); + /** @var AbstractAlbum $album */ + foreach ($this->albums as $album) { + if (!Gate::check(AlbumPolicy::CAN_EDIT, $album)) { + return false; + } + } + + return true; } /** diff --git a/app/Http/Requests/BaseApiRequest.php b/app/Http/Requests/BaseApiRequest.php index 3fc06d81a8..b2e4bc81a8 100644 --- a/app/Http/Requests/BaseApiRequest.php +++ b/app/Http/Requests/BaseApiRequest.php @@ -2,32 +2,24 @@ namespace App\Http\Requests; -use App\Actions\AlbumAuthorisationProvider; -use App\Actions\PhotoAuthorisationProvider; -use App\Contracts\AbstractAlbum; use App\Contracts\LycheeException; use App\Exceptions\Internal\FrameworkException; use App\Exceptions\Internal\InvalidSmartIdException; use App\Exceptions\Internal\QueryBuilderException; use App\Exceptions\UnauthenticatedException; use App\Exceptions\UnauthorizedException; -use App\Facades\AccessControl; use App\Factories\AlbumFactory; -use App\Models\Photo; use Illuminate\Contracts\Container\BindingResolutionException; -use Illuminate\Database\Eloquent\Collection as EloquentCollection; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\UploadedFile; -use Illuminate\Support\Collection as BaseCollection; +use Illuminate\Support\Facades\Auth; use Illuminate\Validation\ValidationException; use Symfony\Component\HttpFoundation\Exception\BadRequestException; abstract class BaseApiRequest extends FormRequest { protected AlbumFactory $albumFactory; - protected AlbumAuthorisationProvider $albumAuthorisationProvider; - protected PhotoAuthorisationProvider $photoAuthorisationProvider; /** * @throws FrameworkException @@ -43,8 +35,6 @@ public function __construct( ) { try { $this->albumFactory = resolve(AlbumFactory::class); - $this->albumAuthorisationProvider = resolve(AlbumAuthorisationProvider::class); - $this->photoAuthorisationProvider = resolve(PhotoAuthorisationProvider::class); parent::__construct($query, $request, $attributes, $cookies, $files, $server, $content); } catch (BindingResolutionException $e) { throw new FrameworkException('Laravel\'s provider component', $e); @@ -121,173 +111,7 @@ protected function passedValidation() */ protected function failedAuthorization(): void { - throw AccessControl::is_logged_in() ? new UnauthorizedException() : new UnauthenticatedException(); - } - - /** - * Determines if the user is authorized to access the designated album. - * - * @param AbstractAlbum|null $album the album - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizeAlbumAccess(?AbstractAlbum $album): bool - { - return $this->albumAuthorisationProvider->isAccessible($album); - } - - /** - * Determines if the user is authorized to access the designated albums. - * - * @param BaseCollection $albums the albums - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizeAlbumsAccess(BaseCollection $albums): bool - { - /** @var AbstractAlbum $album */ - foreach ($albums as $album) { - if (!$this->authorizeAlbumAccess($album)) { - return false; - } - } - - return true; - } - - /** - * Determines if the user is authorized to modify or write into the - * designated album. - * - * @param AbstractAlbum|null $album the album; `null` designates the root album - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizeAlbumWrite(?AbstractAlbum $album): bool - { - return $this->albumAuthorisationProvider->isEditable($album); - } - - /** - * Determines if the user is authorized to modify or write into the - * designated albums. - * - * @param BaseCollection $albums the albums - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizeAlbumsWrite(BaseCollection $albums): bool - { - /** @var AbstractAlbum $album */ - foreach ($albums as $album) { - if (!$this->authorizeAlbumWrite($album)) { - return false; - } - } - - return true; - } - - /** - * Determines if the user is authorized to modify or write into the - * designated albums. - * - * @param string[] $albumIDs the album IDs - * - * @return bool true, if the authenticated user is authorized - * - * @throws QueryBuilderException - */ - protected function authorizeAlbumsWriteByIDs(array $albumIDs): bool - { - return $this->albumAuthorisationProvider->areEditableByIDs($albumIDs); - } - - /** - * Determines if the user is authorized to see the designated photo. - * - * @param Photo|null $photo the photo; `null` is accepted for convenience - * and the `null` photo is always authorized - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizePhotoVisible(?Photo $photo): bool - { - return $this->photoAuthorisationProvider->isVisible($photo); - } - - /** - * Determines if the user is authorized to download the designated photo. - * - * @param Photo $photo the photo - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizePhotoDownload(Photo $photo): bool - { - return $this->photoAuthorisationProvider->isDownloadable($photo); - } - - /** - * Determines if the user is authorized to download the designated photos. - * - * @param EloquentCollection $photos the photos - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizePhotosDownload(EloquentCollection $photos): bool - { - /** @var Photo $photo */ - foreach ($photos as $photo) { - if (!$this->authorizePhotoDownload($photo)) { - return false; - } - } - - return true; - } - - /** - * Determines if the user is authorized to modify the designated photo. - * - * @param Photo $photo the photo - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizePhotoWrite(Photo $photo): bool - { - return $this->photoAuthorisationProvider->isEditable($photo); - } - - /** - * Determines if the user is authorized to modify the designated photos. - * - * @param EloquentCollection $photos the photos - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizePhotosWrite(EloquentCollection $photos): bool - { - /** @var Photo $photo */ - foreach ($photos as $photo) { - if (!$this->authorizePhotoWrite($photo)) { - return false; - } - } - - return true; - } - - /** - * Determines if the user is authorized to modify the designated photos. - * - * @param string[] $photoIDs the IDs of the photos - * - * @return bool true, if the authenticated user is authorized - */ - protected function authorizePhotosWriteByIDs(array $photoIDs): bool - { - return $this->photoAuthorisationProvider->areEditableByIDs($photoIDs); + throw Auth::check() ? new UnauthorizedException() : new UnauthenticatedException(); } /** diff --git a/app/Http/Requests/Import/ImportFromUrlRequest.php b/app/Http/Requests/Import/ImportFromUrlRequest.php index 92f43e1db6..1018de17f8 100644 --- a/app/Http/Requests/Import/ImportFromUrlRequest.php +++ b/app/Http/Requests/Import/ImportFromUrlRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditAlbumTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Models\Album; use App\Rules\RandomIDRule; @@ -12,6 +13,7 @@ class ImportFromUrlRequest extends BaseApiRequest implements HasAlbum { use HasAlbumTrait; + use AuthorizeCanEditAlbumTrait; public const URLS_ATTRIBUTE = 'urls'; @@ -20,14 +22,6 @@ class ImportFromUrlRequest extends BaseApiRequest implements HasAlbum */ protected array $urls = []; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizeAlbumWrite($this->album); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Import/ImportServerRequest.php b/app/Http/Requests/Import/ImportServerRequest.php index 3621bcc99f..4bd0a5df83 100644 --- a/app/Http/Requests/Import/ImportServerRequest.php +++ b/app/Http/Requests/Import/ImportServerRequest.php @@ -3,14 +3,15 @@ namespace App\Http\Requests\Import; use App\Actions\Photo\Strategies\ImportMode; -use App\Facades\AccessControl; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; use App\Http\Requests\Traits\HasAlbumTrait; use App\Models\Album; use App\Models\Configs; +use App\Policies\UserPolicy; use App\Rules\RandomIDRule; +use Illuminate\Support\Facades\Gate; class ImportServerRequest extends BaseApiRequest implements HasAlbum { @@ -34,7 +35,7 @@ public function authorize(): bool // request is made by an admin during authentication (see // `routes/web.php`). // But better safe than sorry. - return AccessControl::is_admin(); + return Gate::check(UserPolicy::IS_ADMIN); } /** diff --git a/app/Http/Requests/Legacy/SetAdminLoginRequest.php b/app/Http/Requests/Legacy/SetAdminLoginRequest.php new file mode 100644 index 0000000000..29b900ca09 --- /dev/null +++ b/app/Http/Requests/Legacy/SetAdminLoginRequest.php @@ -0,0 +1,31 @@ +authorizeAlbumWrite($this->album); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Photo/ArchivePhotosRequest.php b/app/Http/Requests/Photo/ArchivePhotosRequest.php index da61bb8252..7ebf621244 100644 --- a/app/Http/Requests/Photo/ArchivePhotosRequest.php +++ b/app/Http/Requests/Photo/ArchivePhotosRequest.php @@ -9,9 +9,11 @@ use App\Http\Requests\Traits\HasPhotosTrait; use App\Http\Requests\Traits\HasSizeVariantTrait; use App\Models\Photo; +use App\Policies\PhotoPolicy; use App\Rules\RandomIDListRule; use App\Rules\SizeVariantRule; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Support\Facades\Gate; class ArchivePhotosRequest extends BaseApiRequest implements HasPhotos, HasSizeVariant { @@ -23,7 +25,14 @@ class ArchivePhotosRequest extends BaseApiRequest implements HasPhotos, HasSizeV */ public function authorize(): bool { - return $this->authorizePhotosDownload($this->photos); + /** @var Photo $photo */ + foreach ($this->photos as $photo) { + if (!Gate::check(PhotoPolicy::CAN_DOWNLOAD, $photo)) { + return false; + } + } + + return true; } /** diff --git a/app/Http/Requests/Photo/DeletePhotosRequest.php b/app/Http/Requests/Photo/DeletePhotosRequest.php index ddbc0288b0..e2823f567e 100644 --- a/app/Http/Requests/Photo/DeletePhotosRequest.php +++ b/app/Http/Requests/Photo/DeletePhotosRequest.php @@ -5,7 +5,10 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPhotoIDs; use App\Http\Requests\Traits\HasPhotoIDsTrait; +use App\Models\Photo; +use App\Policies\PhotoPolicy; use App\Rules\RandomIDRule; +use Illuminate\Support\Facades\Gate; class DeletePhotosRequest extends BaseApiRequest implements HasPhotoIDs { @@ -16,7 +19,7 @@ class DeletePhotosRequest extends BaseApiRequest implements HasPhotoIDs */ public function authorize(): bool { - return $this->authorizePhotosWriteByIDs($this->photoIDs); + return Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs()]); } /** diff --git a/app/Http/Requests/Photo/DuplicatePhotosRequest.php b/app/Http/Requests/Photo/DuplicatePhotosRequest.php index cafafcb03e..50d1f9f90e 100644 --- a/app/Http/Requests/Photo/DuplicatePhotosRequest.php +++ b/app/Http/Requests/Photo/DuplicatePhotosRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; use App\Http\Requests\Contracts\HasPhotos; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotosAlbumTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Http\Requests\Traits\HasPhotosTrait; use App\Models\Album; @@ -16,15 +17,7 @@ class DuplicatePhotosRequest extends BaseApiRequest implements HasPhotos, HasAlb { use HasPhotosTrait; use HasAlbumTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotosWrite($this->photos) && - $this->authorizeAlbumWrite($this->album); - } + use AuthorizeCanEditPhotosAlbumTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Photo/GetPhotoRequest.php b/app/Http/Requests/Photo/GetPhotoRequest.php index e47a4a76c5..2936214911 100644 --- a/app/Http/Requests/Photo/GetPhotoRequest.php +++ b/app/Http/Requests/Photo/GetPhotoRequest.php @@ -6,7 +6,9 @@ use App\Http\Requests\Contracts\HasPhoto; use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Photo; +use App\Policies\PhotoPolicy; use App\Rules\RandomIDRule; +use Illuminate\Support\Facades\Gate; class GetPhotoRequest extends BaseApiRequest implements HasPhoto { @@ -17,7 +19,7 @@ class GetPhotoRequest extends BaseApiRequest implements HasPhoto */ public function authorize(): bool { - return $this->authorizePhotoVisible($this->photo); + return Gate::check(PhotoPolicy::IS_VISIBLE, $this->photo); } /** diff --git a/app/Http/Requests/Photo/MovePhotosRequest.php b/app/Http/Requests/Photo/MovePhotosRequest.php index 0495128d04..15d40c2863 100644 --- a/app/Http/Requests/Photo/MovePhotosRequest.php +++ b/app/Http/Requests/Photo/MovePhotosRequest.php @@ -6,6 +6,7 @@ use App\Http\Requests\Contracts\HasAbstractAlbum; use App\Http\Requests\Contracts\HasAlbum; use App\Http\Requests\Contracts\HasPhotos; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotosAlbumTrait; use App\Http\Requests\Traits\HasAlbumTrait; use App\Http\Requests\Traits\HasPhotosTrait; use App\Models\Album; @@ -16,15 +17,7 @@ class MovePhotosRequest extends BaseApiRequest implements HasPhotos, HasAlbum { use HasPhotosTrait; use HasAlbumTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotosWrite($this->photos) && - $this->authorizeAlbumWrite($this->album); - } + use AuthorizeCanEditPhotosAlbumTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Photo/RotatePhotoRequest.php b/app/Http/Requests/Photo/RotatePhotoRequest.php index 8515c19111..bb5c063e1a 100644 --- a/app/Http/Requests/Photo/RotatePhotoRequest.php +++ b/app/Http/Requests/Photo/RotatePhotoRequest.php @@ -4,6 +4,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPhoto; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotoTrait; use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Photo; use App\Rules\RandomIDRule; @@ -12,19 +13,12 @@ class RotatePhotoRequest extends BaseApiRequest implements HasPhoto { use HasPhotoTrait; + use AuthorizeCanEditPhotoTrait; public const DIRECTION_ATTRIBUTE = 'direction'; protected int $direction; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotoWrite($this->photo); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Photo/SetPhotoDescriptionRequest.php b/app/Http/Requests/Photo/SetPhotoDescriptionRequest.php index db06196e9c..fc302be1f9 100644 --- a/app/Http/Requests/Photo/SetPhotoDescriptionRequest.php +++ b/app/Http/Requests/Photo/SetPhotoDescriptionRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasDescription; use App\Http\Requests\Contracts\HasPhoto; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotoTrait; use App\Http\Requests\Traits\HasDescriptionTrait; use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Photo; @@ -15,14 +16,7 @@ class SetPhotoDescriptionRequest extends BaseApiRequest implements HasPhoto, Has { use HasPhotoTrait; use HasDescriptionTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotoWrite($this->photo); - } + use AuthorizeCanEditPhotoTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Photo/SetPhotoLicenseRequest.php b/app/Http/Requests/Photo/SetPhotoLicenseRequest.php index 3b2eb48ec3..841338d7d8 100644 --- a/app/Http/Requests/Photo/SetPhotoLicenseRequest.php +++ b/app/Http/Requests/Photo/SetPhotoLicenseRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasLicense; use App\Http\Requests\Contracts\HasPhoto; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotoTrait; use App\Http\Requests\Traits\HasLicenseTrait; use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Photo; @@ -15,14 +16,7 @@ class SetPhotoLicenseRequest extends BaseApiRequest implements HasPhoto, HasLice { use HasPhotoTrait; use HasLicenseTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotoWrite($this->photo); - } + use AuthorizeCanEditPhotoTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Photo/SetPhotoPublicRequest.php b/app/Http/Requests/Photo/SetPhotoPublicRequest.php index b09553069d..a586fbf0a1 100644 --- a/app/Http/Requests/Photo/SetPhotoPublicRequest.php +++ b/app/Http/Requests/Photo/SetPhotoPublicRequest.php @@ -4,6 +4,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPhoto; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotoTrait; use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Photo; use App\Rules\RandomIDRule; @@ -14,18 +15,12 @@ class SetPhotoPublicRequest extends BaseApiRequest implements HasPhoto { use HasPhotoTrait; + use AuthorizeCanEditPhotoTrait; + public const IS_PUBLIC_ATTRIBUTE = 'is_public'; protected bool $isPublic = false; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotoWrite($this->photo); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Photo/SetPhotosStarredRequest.php b/app/Http/Requests/Photo/SetPhotosStarredRequest.php index d1377c1717..1e07d6d35b 100644 --- a/app/Http/Requests/Photo/SetPhotosStarredRequest.php +++ b/app/Http/Requests/Photo/SetPhotosStarredRequest.php @@ -4,6 +4,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPhotos; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotosTrait; use App\Http\Requests\Traits\HasPhotosTrait; use App\Models\Photo; use App\Rules\RandomIDRule; @@ -14,18 +15,12 @@ class SetPhotosStarredRequest extends BaseApiRequest implements HasPhotos { use HasPhotosTrait; + use AuthorizeCanEditPhotosTrait; + public const IS_STARRED_ATTRIBUTE = 'is_starred'; protected bool $isStarred = false; - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotosWrite($this->photos); - } - /** * {@inheritDoc} */ diff --git a/app/Http/Requests/Photo/SetPhotosTagsRequest.php b/app/Http/Requests/Photo/SetPhotosTagsRequest.php index f71940ca12..a186c28e71 100644 --- a/app/Http/Requests/Photo/SetPhotosTagsRequest.php +++ b/app/Http/Requests/Photo/SetPhotosTagsRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPhotos; use App\Http\Requests\Contracts\HasTags; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotosTrait; use App\Http\Requests\Traits\HasPhotosTrait; use App\Http\Requests\Traits\HasTagsTrait; use App\Models\Photo; @@ -14,14 +15,7 @@ class SetPhotosTagsRequest extends BaseApiRequest implements HasPhotos, HasTags { use HasPhotosTrait; use HasTagsTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotosWrite($this->photos); - } + use AuthorizeCanEditPhotosTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Photo/SetPhotosTitleRequest.php b/app/Http/Requests/Photo/SetPhotosTitleRequest.php index 15410dd233..ca5dae908c 100644 --- a/app/Http/Requests/Photo/SetPhotosTitleRequest.php +++ b/app/Http/Requests/Photo/SetPhotosTitleRequest.php @@ -5,6 +5,7 @@ use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPhotos; use App\Http\Requests\Contracts\HasTitle; +use App\Http\Requests\Traits\Authorize\AuthorizeCanEditPhotosTrait; use App\Http\Requests\Traits\HasPhotosTrait; use App\Http\Requests\Traits\HasTitleTrait; use App\Models\Photo; @@ -15,14 +16,7 @@ class SetPhotosTitleRequest extends BaseApiRequest implements HasPhotos, HasTitl { use HasPhotosTrait; use HasTitleTrait; - - /** - * {@inheritDoc} - */ - public function authorize(): bool - { - return $this->authorizePhotosWrite($this->photos); - } + use AuthorizeCanEditPhotosTrait; /** * {@inheritDoc} diff --git a/app/Http/Requests/Search/SearchRequest.php b/app/Http/Requests/Search/SearchRequest.php index 774ac0f0c4..ed16ab3e09 100644 --- a/app/Http/Requests/Search/SearchRequest.php +++ b/app/Http/Requests/Search/SearchRequest.php @@ -2,9 +2,9 @@ namespace App\Http\Requests\Search; -use App\Facades\AccessControl; use App\Http\Requests\BaseApiRequest; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; class SearchRequest extends BaseApiRequest { @@ -20,7 +20,7 @@ class SearchRequest extends BaseApiRequest */ public function authorize(): bool { - return AccessControl::is_logged_in() || Configs::getValueAsBool('public_search'); + return Auth::check() || Configs::getValueAsBool('public_search'); } /** diff --git a/app/Http/Requests/Settings/ChangeLoginRequest.php b/app/Http/Requests/Settings/ChangeLoginRequest.php index 0d87df4981..2d21aada8e 100644 --- a/app/Http/Requests/Settings/ChangeLoginRequest.php +++ b/app/Http/Requests/Settings/ChangeLoginRequest.php @@ -2,48 +2,31 @@ namespace App\Http\Requests\Settings; -use App\Facades\AccessControl; -use App\Http\Requests\Session\LoginRequest; +use App\Http\Requests\BaseApiRequest; +use App\Http\Requests\Contracts\HasPassword; +use App\Http\Requests\Contracts\HasUsername; use App\Http\Requests\Traits\HasPasswordTrait; +use App\Models\User; +use App\Policies\UserPolicy; use App\Rules\PasswordRule; use App\Rules\UsernameRule; +use Illuminate\Support\Facades\Gate; -class ChangeLoginRequest extends LoginRequest +class ChangeLoginRequest extends BaseApiRequest implements HasPassword { - public const OLD_USERNAME_ATTRIBUTE = 'oldUsername'; + use HasPasswordTrait; + public const OLD_PASSWORD_ATTRIBUTE = 'oldPassword'; - protected ?string $oldUsername = null; - protected ?string $oldPassword = null; + protected string $oldPassword; + protected ?string $username = null; /** * Determines if the user is authorized to make this request. - * - * TODO: This method need to be rewritten after {@link \App\Actions\Settings\Login::do()} has been refactored. - * - * Normally, the request to change a user's password should - * only be authorized for admin or non-locked users. - * However, at the moment the method - * {@link \App\Actions\Settings\Login::do()} is a "god" method and serves - * three totally different use-cases mixed into one method (see comment - * there). - * We cannot reliably determine if the request is authorized without - * knowing which of the use-case applies and thus without repeating - * most of the logic of {@link \App\Actions\Settings\Login::do()}. - * Hence, we authorize this request unconditionally and assume that - * {@link \App\Actions\Settings\Login::do()} enforces correct - * authorization. - * - * @return bool always true */ public function authorize(): bool { - /*return AccessControl::is_logged_in() && ( - AccessControl::is_admin() || - !AccessControl::user()->is_locked - );*/ - - return true; + return Gate::check(UserPolicy::CAN_EDIT_SETTINGS, User::class); } /** @@ -51,11 +34,11 @@ public function authorize(): bool */ public function rules(): array { - $rules = parent::rules(); - $rules[self::OLD_USERNAME_ATTRIBUTE] = ['sometimes', new UsernameRule()]; - $rules[self::OLD_PASSWORD_ATTRIBUTE] = ['sometimes', new PasswordRule(false)]; - - return $rules; + return [ + HasUsername::USERNAME_ATTRIBUTE => ['sometimes', new UsernameRule()], + HasPassword::PASSWORD_ATTRIBUTE => ['required', new PasswordRule(false)], + self::OLD_PASSWORD_ATTRIBUTE => ['required', new PasswordRule(false)], + ]; } /** @@ -63,27 +46,20 @@ public function rules(): array */ protected function processValidatedValues(array $values, array $files): void { - parent::processValidatedValues($values, $files); - $this->oldUsername = $values[self::OLD_USERNAME_ATTRIBUTE] ?? null; - if (array_key_exists(self::OLD_PASSWORD_ATTRIBUTE, $values)) { - // See {@link HasPasswordTrait::password()} for an explanation - // of the semantic difference between `null` and `''`. - $this->oldPassword = $values[self::OLD_PASSWORD_ATTRIBUTE] ?? ''; + $this->password = $values[HasPassword::PASSWORD_ATTRIBUTE]; + $this->oldPassword = $values[self::OLD_PASSWORD_ATTRIBUTE]; + + // We do not allow '' as a username. So any such input will be cast to null + if (array_key_exists(HasUsername::USERNAME_ATTRIBUTE, $values)) { + $this->username = trim($values[HasUsername::USERNAME_ATTRIBUTE]); + $this->username = $this->username === '' ? null : $this->username; } else { - $this->oldPassword = null; + $this->username = null; } } /** - * @return string|null - */ - public function oldUsername(): ?string - { - return $this->oldUsername; - } - - /** - * Returns the previous (old) password, if available. + * Returns the previous password. * * See {@link HasPasswordTrait::password()} for an explanation of the * semantic difference between the return values `null` and `''`. @@ -94,4 +70,15 @@ public function oldPassword(): ?string { return $this->oldPassword; } + + /** + * Return the new username chosen. + * if Username is null, this means that the user does not want to update it. + * + * @return ?string + */ + public function username(): ?string + { + return $this->username; + } } \ No newline at end of file diff --git a/app/Http/Requests/Settings/SetSortingRequest.php b/app/Http/Requests/Settings/SetSortingRequest.php index 2a727e6981..9f608ccd1c 100644 --- a/app/Http/Requests/Settings/SetSortingRequest.php +++ b/app/Http/Requests/Settings/SetSortingRequest.php @@ -3,9 +3,11 @@ namespace App\Http\Requests\Settings; use App\Http\Requests\BaseApiRequest; +use App\Policies\UserPolicy; use App\Rules\AlbumSortingRule; use App\Rules\OrderRule; use App\Rules\PhotoSortingRule; +use Illuminate\Support\Facades\Gate; class SetSortingRequest extends BaseApiRequest { @@ -24,7 +26,7 @@ class SetSortingRequest extends BaseApiRequest */ public function authorize(): bool { - return true; + return Gate::check(UserPolicy::IS_ADMIN); } /** diff --git a/app/Http/Requests/Sharing/DeleteSharingRequest.php b/app/Http/Requests/Sharing/DeleteSharingRequest.php index 093f595027..42fbcf2a56 100644 --- a/app/Http/Requests/Sharing/DeleteSharingRequest.php +++ b/app/Http/Requests/Sharing/DeleteSharingRequest.php @@ -2,9 +2,11 @@ namespace App\Http\Requests\Sharing; -use App\Facades\AccessControl; use App\Http\Requests\BaseApiRequest; +use App\Models\User; +use App\Policies\UserPolicy; use App\Rules\IntegerIDRule; +use Illuminate\Support\Facades\Gate; class DeleteSharingRequest extends BaseApiRequest { @@ -20,7 +22,7 @@ class DeleteSharingRequest extends BaseApiRequest */ public function authorize(): bool { - return AccessControl::can_upload(); + return Gate::check(UserPolicy::CAN_UPLOAD, User::class); } /** diff --git a/app/Http/Requests/Sharing/SetSharingRequest.php b/app/Http/Requests/Sharing/SetSharingRequest.php index 38d3a86a13..fa94bad877 100644 --- a/app/Http/Requests/Sharing/SetSharingRequest.php +++ b/app/Http/Requests/Sharing/SetSharingRequest.php @@ -2,14 +2,16 @@ namespace App\Http\Requests\Sharing; -use App\Facades\AccessControl; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasAlbumIDs; use App\Http\Requests\Contracts\HasUserIDs; use App\Http\Requests\Traits\HasAlbumIDsTrait; use App\Http\Requests\Traits\HasUserIDsTrait; +use App\Models\User; +use App\Policies\UserPolicy; use App\Rules\IntegerIDRule; use App\Rules\RandomIDRule; +use Illuminate\Support\Facades\Gate; class SetSharingRequest extends BaseApiRequest implements HasAlbumIDs, HasUserIDs { @@ -21,7 +23,7 @@ class SetSharingRequest extends BaseApiRequest implements HasAlbumIDs, HasUserID */ public function authorize(): bool { - return AccessControl::can_upload(); + return Gate::check(UserPolicy::CAN_UPLOAD, User::class); } /** diff --git a/app/Http/Requests/Traits/Authorize/AuthorizeCanEditAlbumAlbumsTrait.php b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditAlbumAlbumsTrait.php new file mode 100644 index 0000000000..b6c8065a08 --- /dev/null +++ b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditAlbumAlbumsTrait.php @@ -0,0 +1,29 @@ +album])) { + return false; + } + + /** @var AbstractAlbum $album */ + foreach ($this->albums as $album) { + if (!Gate::check(AlbumPolicy::CAN_EDIT, $album)) { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/app/Http/Requests/Traits/Authorize/AuthorizeCanEditAlbumTrait.php b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditAlbumTrait.php new file mode 100644 index 0000000000..8b6fa43d30 --- /dev/null +++ b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditAlbumTrait.php @@ -0,0 +1,22 @@ +album]); + } +} \ No newline at end of file diff --git a/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotoTrait.php b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotoTrait.php new file mode 100644 index 0000000000..3e67b8a302 --- /dev/null +++ b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotoTrait.php @@ -0,0 +1,22 @@ +photo]); + } +} \ No newline at end of file diff --git a/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotosAlbumTrait.php b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotosAlbumTrait.php new file mode 100644 index 0000000000..bba6a7b080 --- /dev/null +++ b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotosAlbumTrait.php @@ -0,0 +1,34 @@ +album])) { + return false; + } + + /** @var Photo $photo */ + foreach ($this->photos as $photo) { + if (!Gate::check(PhotoPolicy::CAN_EDIT, $photo)) { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotosTrait.php b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotosTrait.php new file mode 100644 index 0000000000..2c440285fa --- /dev/null +++ b/app/Http/Requests/Traits/Authorize/AuthorizeCanEditPhotosTrait.php @@ -0,0 +1,28 @@ +photos as $photo) { + if (!Gate::check(PhotoPolicy::CAN_EDIT, $photo)) { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/app/Http/Requests/User/AbstractUserRequest.php b/app/Http/Requests/User/AbstractUserRequest.php index 0d8f572a11..0b9e7f39be 100644 --- a/app/Http/Requests/User/AbstractUserRequest.php +++ b/app/Http/Requests/User/AbstractUserRequest.php @@ -2,14 +2,15 @@ namespace App\Http\Requests\User; -use App\Facades\AccessControl; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasPassword; use App\Http\Requests\Contracts\HasUsername; use App\Http\Requests\Traits\HasPasswordTrait; use App\Http\Requests\Traits\HasUsernameTrait; +use App\Policies\UserPolicy; use App\Rules\PasswordRule; use App\Rules\UsernameRule; +use Illuminate\Support\Facades\Gate; abstract class AbstractUserRequest extends BaseApiRequest implements HasUsername, HasPassword { @@ -31,7 +32,7 @@ public function authorize(): bool // request is made by an admin during authentication (see // `routes/web.php`). // But better safe than sorry. - return AccessControl::is_admin(); + return Gate::check(UserPolicy::IS_ADMIN); } /** diff --git a/app/Http/Requests/User/DeleteUserRequest.php b/app/Http/Requests/User/DeleteUserRequest.php index be73370070..b9d49de7b1 100644 --- a/app/Http/Requests/User/DeleteUserRequest.php +++ b/app/Http/Requests/User/DeleteUserRequest.php @@ -2,12 +2,13 @@ namespace App\Http\Requests\User; -use App\Facades\AccessControl; use App\Http\Requests\BaseApiRequest; use App\Http\Requests\Contracts\HasUser; use App\Http\Requests\Traits\HasUserTrait; use App\Models\User; +use App\Policies\UserPolicy; use App\Rules\IntegerIDRule; +use Illuminate\Support\Facades\Gate; class DeleteUserRequest extends BaseApiRequest implements HasUser { @@ -24,7 +25,7 @@ public function authorize(): bool // request is made by an admin during authentication (see // `routes/web.php`). // But better safe than sorry. - return AccessControl::is_admin(); + return Gate::check(UserPolicy::IS_ADMIN); } /** diff --git a/app/Http/Requests/User/SetEmailRequest.php b/app/Http/Requests/User/SetEmailRequest.php index 24c1f1dc75..1004ce8062 100644 --- a/app/Http/Requests/User/SetEmailRequest.php +++ b/app/Http/Requests/User/SetEmailRequest.php @@ -3,6 +3,9 @@ namespace App\Http\Requests\User; use App\Http\Requests\BaseApiRequest; +use App\Models\User; +use App\Policies\UserPolicy; +use Illuminate\Support\Facades\Gate; class SetEmailRequest extends BaseApiRequest { @@ -12,7 +15,7 @@ class SetEmailRequest extends BaseApiRequest public function authorize(): bool { - return true; + return Gate::check(UserPolicy::CAN_EDIT_SETTINGS, User::class); } public function rules(): array diff --git a/app/Http/Requests/View/GetPhotoViewRequest.php b/app/Http/Requests/View/GetPhotoViewRequest.php index 548df71044..e99aa31f2b 100644 --- a/app/Http/Requests/View/GetPhotoViewRequest.php +++ b/app/Http/Requests/View/GetPhotoViewRequest.php @@ -6,7 +6,9 @@ use App\Http\Requests\Contracts\HasPhoto; use App\Http\Requests\Traits\HasPhotoTrait; use App\Models\Photo; +use App\Policies\PhotoPolicy; use App\Rules\RandomIDRule; +use Illuminate\Support\Facades\Gate; class GetPhotoViewRequest extends BaseApiRequest implements HasPhoto { @@ -18,7 +20,7 @@ class GetPhotoViewRequest extends BaseApiRequest implements HasPhoto */ public function authorize(): bool { - return $this->authorizePhotoVisible($this->photo); + return Gate::check(PhotoPolicy::IS_VISIBLE, $this->photo); } /** diff --git a/app/Image/FileDeleter.php b/app/Image/FileDeleter.php index f04569c72d..48b4e09428 100644 --- a/app/Image/FileDeleter.php +++ b/app/Image/FileDeleter.php @@ -104,7 +104,7 @@ public function do(): void // If the disk uses the local driver, we use low-level routines as // these are also able to handle symbolic links in case of doubt - $isLocalDisk = ($defaultDisk->getDriver()->getAdapter() instanceof LocalAdapter); + $isLocalDisk = $defaultDisk->getDriver()->getAdapter() instanceof LocalAdapter; if ($isLocalDisk) { foreach ($this->regularFilesOrSymbolicLinks as $fileOrLink) { try { diff --git a/app/Image/GdHandler.php b/app/Image/GdHandler.php index 71991f091d..8c69a49049 100644 --- a/app/Image/GdHandler.php +++ b/app/Image/GdHandler.php @@ -135,7 +135,7 @@ public function load(MediaFile $file): void $this->reset(); $originalStream = $file->read(); - if ((stream_get_meta_data($originalStream))['seekable']) { + if (stream_get_meta_data($originalStream)['seekable']) { $inputStream = $originalStream; } else { // We make an in-memory copy of the provided stream, diff --git a/app/Image/ImagickHandler.php b/app/Image/ImagickHandler.php index c978c3cf00..c369f56c77 100644 --- a/app/Image/ImagickHandler.php +++ b/app/Image/ImagickHandler.php @@ -43,7 +43,7 @@ public function load(MediaFile $file): void $this->reset(); $originalStream = $file->read(); - if ((stream_get_meta_data($originalStream))['seekable']) { + if (stream_get_meta_data($originalStream)['seekable']) { $inputStream = $originalStream; } else { // We make an in-memory copy of the provided stream, @@ -149,7 +149,7 @@ public function cloneAndScale(ImageDimension $dstDim): ImageHandlerInterface try { $clone = clone $this; if (!$clone->imImage->scaleImage( - $dstDim->width, $dstDim->height, ($dstDim->width !== 0 && $dstDim->height !== 0) + $dstDim->width, $dstDim->height, $dstDim->width !== 0 && $dstDim->height !== 0 )) { throw new ImagickException('Failed to scale image'); } diff --git a/app/Legacy/AdminAuthentication.php b/app/Legacy/AdminAuthentication.php new file mode 100644 index 0000000000..597872b0ca --- /dev/null +++ b/app/Legacy/AdminAuthentication.php @@ -0,0 +1,89 @@ +find(0); + + // Admin User exists, so we check against it. + if ($adminUser !== null && Hash::check($username, $adminUser->username) && Hash::check($password, $adminUser->password)) { + Auth::login($adminUser); + Logs::notice(__METHOD__, __LINE__, 'User (' . $username . ') has logged in from ' . $ip); + + // update the admin username so we do not need to go through here anymore. + $adminUser->username = $username; + $adminUser->save(); + + return true; + } + + return false; + } + + /** + * Checks whether the admin is unconfigured. + * The method is not side-effect free. + * If the admin user happens to not exist at all, the method creates an unconfigured admin. + * + * @return bool + * + * @throws ModelDBException + */ + public static function isAdminNotRegistered(): bool + { + /** @var User|null $adminUser */ + $adminUser = User::query()->find(0); + if ($adminUser !== null) { + return $adminUser->password === '' || $adminUser->username === ''; + } + resolve(ResetAdmin::class)->do(); + + return true; + } + + /** + * TODO: Once the admin user registration is moved to the installation phase this method can finally be removed. + * + * Login as admin temporarily when unconfigured. + * + * @return bool true if successful + * + * @throws ModelDBException + */ + public static function loginAsAdminIfNotRegistered(): bool + { + if (self::isAdminNotRegistered()) { + /** @var User|null $adminUser */ + $adminUser = User::query()->find(0); + Auth::login($adminUser); + + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/app/Legacy/Legacy.php b/app/Legacy/Legacy.php index 78f259a0eb..69d0769fa3 100644 --- a/app/Legacy/Legacy.php +++ b/app/Legacy/Legacy.php @@ -3,7 +3,6 @@ namespace App\Legacy; use App\Exceptions\ConfigurationException; -use App\Exceptions\Internal\InvalidConfigOption; use App\Exceptions\Internal\QueryBuilderException; use App\Models\Configs; use App\Models\Logs; @@ -11,80 +10,12 @@ use App\Rules\RandomIDRule; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\Session; /** * Stuff we need to delete in the future. */ class Legacy { - /** - * @throws QueryBuilderException - */ - public static function resetAdmin(): void - { - Configs::query() - ->where('key', '=', 'username') - ->orWhere('key', '=', 'password') - ->update(['value' => '']); - } - - /** - * @throws InvalidConfigOption - */ - public static function SetPassword(string $hashedUsername, string $hashedPassword): bool - { - $configs = Configs::get(); - - if (Configs::getValueAsString('version') < '040008') { - if ($configs['password'] === '' && $configs['username'] === '') { - Configs::set('username', $hashedUsername); - Configs::set('password', $hashedPassword); - - return true; - } - } - - return false; - } - - public static function noLogin(): bool - { - // LEGACY STUFF - $configs = Configs::get(); - - if (Configs::getValueAsString('version') <= '040008') { - // Check if login credentials exist and login if they don't - if ( - isset($configs['username']) && $configs['username'] === '' && - isset($configs['password']) && $configs['password'] === '' - ) { - Session::put('login', true); - Session::put('UserID', 0); - - return true; - } - } - - return false; - } - - public static function log_as_admin(string $username, string $password, string $ip): bool - { - $configs = Configs::get(); - - if (Hash::check($username, $configs['username']) && Hash::check($password, $configs['password'])) { - Session::put('login', true); - Session::put('UserID', 0); - Logs::notice(__METHOD__, __LINE__, 'User (' . $username . ') has logged in from ' . $ip . ' (legacy)'); - - return true; - } - - return false; - } - public static function isLegacyModelID(string $id): bool { $modernIDRule = new RandomIDRule(true); diff --git a/app/Locale/ChineseSimplified.php b/app/Locale/ChineseSimplified.php index 257a8f7227..51fa7e4147 100644 --- a/app/Locale/ChineseSimplified.php +++ b/app/Locale/ChineseSimplified.php @@ -337,7 +337,6 @@ public function get_locale(): array 'LOGIN_CREATE' => '创建', 'PASSWORD_TITLE' => '输入您当前的密码:', - 'USERNAME_CURRENT' => '当前用户名', 'PASSWORD_CURRENT' => '当前密码', 'PASSWORD_TEXT' => '您的用户名和密码将被修改为:', 'PASSWORD_CHANGE' => '修改登录信息', diff --git a/app/Locale/ChineseTraditional.php b/app/Locale/ChineseTraditional.php index a40280b9b3..cc5c69ed09 100644 --- a/app/Locale/ChineseTraditional.php +++ b/app/Locale/ChineseTraditional.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => '創建', 'PASSWORD_TITLE' => '當前密碼', - 'USERNAME_CURRENT' => '當前用戶名', 'PASSWORD_CURRENT' => '當前密碼', 'PASSWORD_TEXT' => '用戶名和密碼將被修改為:', 'PASSWORD_CHANGE' => '修改登入訊息', diff --git a/app/Locale/Czech.php b/app/Locale/Czech.php index 6d86cca67f..c8005e2461 100644 --- a/app/Locale/Czech.php +++ b/app/Locale/Czech.php @@ -340,7 +340,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Vytvořit uživatele', 'PASSWORD_TITLE' => 'Zadejte aktuální heslo:', - 'USERNAME_CURRENT' => 'Aktuální uživatelské jméno', 'PASSWORD_CURRENT' => 'Aktuální heslo', 'PASSWORD_TEXT' => 'Vaše uživatelské jméno a heslo budou změněny následovně:', 'PASSWORD_CHANGE' => 'Změnit přihlášení', diff --git a/app/Locale/Dutch.php b/app/Locale/Dutch.php index cfb659a577..0bf6af8e49 100644 --- a/app/Locale/Dutch.php +++ b/app/Locale/Dutch.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Maak Login', 'PASSWORD_TITLE' => 'Voer je huidige wachtwoord in:', - 'USERNAME_CURRENT' => 'Current Username', 'PASSWORD_CURRENT' => 'Huidig Wachtwoord', 'PASSWORD_TEXT' => 'Je gebruikersnaam en wachtwoord worden verandert naar:', 'PASSWORD_CHANGE' => 'Verander Login', diff --git a/app/Locale/English.php b/app/Locale/English.php index 347f1f90bb..a92c395bfd 100644 --- a/app/Locale/English.php +++ b/app/Locale/English.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Create Login', 'PASSWORD_TITLE' => 'Enter your current password:', - 'USERNAME_CURRENT' => 'Current Username', 'PASSWORD_CURRENT' => 'Current Password', 'PASSWORD_TEXT' => 'Your username and password will be changed to the following:', 'PASSWORD_CHANGE' => 'Change Login', diff --git a/app/Locale/French.php b/app/Locale/French.php index ceed2eb74f..306aaf278a 100644 --- a/app/Locale/French.php +++ b/app/Locale/French.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Créer les informations de connexion', 'PASSWORD_TITLE' => 'Entrez votre mot de passe existant :', - 'USERNAME_CURRENT' => 'Nom d’utilisateur actuel :', 'PASSWORD_CURRENT' => 'Mot de passe existant :', 'PASSWORD_TEXT' => 'Votre nom d’utilisateur et votre mot de passe seront modifiés comme suit :', 'PASSWORD_CHANGE' => 'Modifier les informations de connexion', diff --git a/app/Locale/German.php b/app/Locale/German.php index aca3d5a281..d6d7a61ba8 100644 --- a/app/Locale/German.php +++ b/app/Locale/German.php @@ -341,7 +341,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Benutzer anlegen', 'PASSWORD_TITLE' => 'Geben Sie Ihr bestehendes Kennwort ein:', - 'USERNAME_CURRENT' => 'Bestehender Benutzername', 'PASSWORD_CURRENT' => 'Bestehendes Kennwort', 'PASSWORD_TEXT' => 'Ihr Benutzername und Passwort werden wie folgt geändert:', 'PASSWORD_CHANGE' => 'Benutzer ändern', diff --git a/app/Locale/Greek.php b/app/Locale/Greek.php index 82083c1634..81d5a50c13 100644 --- a/app/Locale/Greek.php +++ b/app/Locale/Greek.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Δημιουργία στοιχείων εισόδου', 'PASSWORD_TITLE' => 'Εισάγετε τον τρέχον κωδικό πρόσβασης:', - 'USERNAME_CURRENT' => 'Τρέχον Όνομα Χρήστη', 'PASSWORD_CURRENT' => 'Τρέχον κωδικός πρόσβασης', 'PASSWORD_TEXT' => 'Το όνομα χρήστη και ο κωδικός πρόσβασής σας θα αλλάξουν στα παρακάτω:', 'PASSWORD_CHANGE' => 'Αλλαγή στοιχείων εισόδου', diff --git a/app/Locale/Italian.php b/app/Locale/Italian.php index 6e3dc52e96..a3bf88bd15 100644 --- a/app/Locale/Italian.php +++ b/app/Locale/Italian.php @@ -338,7 +338,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Crea Login', 'PASSWORD_TITLE' => 'Inserisci la tua password attuale:', - 'USERNAME_CURRENT' => 'Nome Utente Attuale', 'PASSWORD_CURRENT' => 'Password Attuale', 'PASSWORD_TEXT' => 'Il tuo nome utente e password verrano cambiati nei seguenti:', 'PASSWORD_CHANGE' => 'Cambia Login', diff --git a/app/Locale/NorwegianBokmal.php b/app/Locale/NorwegianBokmal.php index e6c50c2a43..dc880b7538 100644 --- a/app/Locale/NorwegianBokmal.php +++ b/app/Locale/NorwegianBokmal.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Lag Innlogging', 'PASSWORD_TITLE' => 'Fyll inn ditt nåværende passord:', - 'USERNAME_CURRENT' => 'Nåværende Brukernavn', 'PASSWORD_CURRENT' => 'Nåværende Passord', 'PASSWORD_TEXT' => 'Brukernavnet og passordet ditt vil bli endret til det følgende:', 'PASSWORD_CHANGE' => 'Lagre brukernavn og passord', diff --git a/app/Locale/Polish.php b/app/Locale/Polish.php index 82c57c96e8..d5c82fa3a8 100644 --- a/app/Locale/Polish.php +++ b/app/Locale/Polish.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Utwórz login', 'PASSWORD_TITLE' => 'Wpisz aktualne dane dostępowe:', - 'USERNAME_CURRENT' => 'Aktualna nazwa użytkownika', 'PASSWORD_CURRENT' => 'Aktualne hasło', 'PASSWORD_TEXT' => 'Twoja nazwa użytkownika oraz hasło zostaną zmienione na następujące:', 'PASSWORD_CHANGE' => 'Zmień login', diff --git a/app/Locale/Portuguese.php b/app/Locale/Portuguese.php index 728c335703..8de1fe5398 100644 --- a/app/Locale/Portuguese.php +++ b/app/Locale/Portuguese.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Criar Login', 'PASSWORD_TITLE' => 'Inserir a sua password atual:', - 'USERNAME_CURRENT' => 'Nome de Utilizador Atual', 'PASSWORD_CURRENT' => 'Password Atual', 'PASSWORD_TEXT' => 'O seu nome de utilizador e password vão ser alterados para o seguinte:', 'PASSWORD_CHANGE' => 'Alterar Login', diff --git a/app/Locale/Russian.php b/app/Locale/Russian.php index aed3a0c4fc..4008237e75 100644 --- a/app/Locale/Russian.php +++ b/app/Locale/Russian.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Создать', 'PASSWORD_TITLE' => 'Введите текущий пароль:', - 'USERNAME_CURRENT' => 'Текущий логин', 'PASSWORD_CURRENT' => 'Текущий пароль', 'PASSWORD_TEXT' => 'Ваши логин и пароль будут изменены на следующие:', 'PASSWORD_CHANGE' => 'Изменить данные', diff --git a/app/Locale/Slovak.php b/app/Locale/Slovak.php index 8dac38da22..7f23f2d48c 100644 --- a/app/Locale/Slovak.php +++ b/app/Locale/Slovak.php @@ -340,7 +340,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Založiť užívateľa', 'PASSWORD_TITLE' => 'Zadajte vaše heslo:', - 'USERNAME_CURRENT' => 'Vaše pôvodné meno', 'PASSWORD_CURRENT' => 'Vaše pôvodné heslo', 'PASSWORD_TEXT' => 'Vaše meno a heslo bolo zmenené nasledovne:', 'PASSWORD_CHANGE' => 'Prihlásenie zmeniť', diff --git a/app/Locale/Spanish.php b/app/Locale/Spanish.php index 0bbad79d0c..5b6f9986a8 100644 --- a/app/Locale/Spanish.php +++ b/app/Locale/Spanish.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Crear inicio de sesión', 'PASSWORD_TITLE' => 'Introduce tu contraseña actual:', - 'USERNAME_CURRENT' => 'Nombre de usuario actual', 'PASSWORD_CURRENT' => 'Contraseña actual', 'PASSWORD_TEXT' => 'Su nombre de usuario y contraseña se cambiarán a lo siguiente:', 'PASSWORD_CHANGE' => 'Cambiar inicio de sesión', diff --git a/app/Locale/Swedish.php b/app/Locale/Swedish.php index 89e266f27f..39cdfbcc24 100644 --- a/app/Locale/Swedish.php +++ b/app/Locale/Swedish.php @@ -336,7 +336,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Skapa inloggning', 'PASSWORD_TITLE' => 'Ange dina befintliga inloggningsuppgifter:', - 'USERNAME_CURRENT' => 'Befintligt användarnamn', 'PASSWORD_CURRENT' => 'Befintligt lösenord', 'PASSWORD_TEXT' => 'Ditt inloggningsuppgifter kommer att ändras till:', 'PASSWORD_CHANGE' => 'Spara ändringar av inloggningsuppgifter', diff --git a/app/Locale/Vietnamese.php b/app/Locale/Vietnamese.php index 7244b5e93e..eca3b2c894 100644 --- a/app/Locale/Vietnamese.php +++ b/app/Locale/Vietnamese.php @@ -337,7 +337,6 @@ public function get_locale(): array 'LOGIN_CREATE' => 'Tạo thông tin đăng nhập', 'PASSWORD_TITLE' => 'Nhập mật khẩu cũ của bạn:', - 'USERNAME_CURRENT' => 'Tên đăng nhập cũ', 'PASSWORD_CURRENT' => 'Mật khẩu cũ', 'PASSWORD_TEXT' => 'Tên đăng nhập và mật khẩu của bạn sẽ được thay đổi thành như sau:', 'PASSWORD_CHANGE' => 'Thay đổi thông tin đăng nhập', diff --git a/app/ModelFunctions/SessionFunctions.php b/app/ModelFunctions/SessionFunctions.php deleted file mode 100644 index 0734499311..0000000000 --- a/app/ModelFunctions/SessionFunctions.php +++ /dev/null @@ -1,207 +0,0 @@ -is_logged_in() && Session::get('UserID') === 0; - } - - /** - * @throws UnauthenticatedException - */ - public function can_upload(): bool - { - return $this->is_logged_in() && ($this->id() === 0 || $this->user()->may_upload); - } - - /** - * Return the current ID of the user - * what happens when UserID is not set? :p. - * - * @return int - * - * @throws UnauthenticatedException - */ - public function id(): int - { - if (!$this->is_logged_in()) { - throw new UnauthenticatedException(); - } - - return Session::get('UserID'); - } - - /** - * Return User object given a positive ID. - * - * @throws UnauthenticatedException - * @throws ModelNotFoundException - */ - private function accessUserData(): User - { - $id = $this->id(); - $this->user_data = User::query()->findOrFail($id); - - // `findOrFail` above returns a union type, but we know that it - // returns the correct `User` mode in this case - // @phpstan-ignore-next-line - return $this->user_data; - } - - /** - * Return User object and cache the result. - * - * @throws UnauthenticatedException - */ - public function user(): User - { - return $this->user_data ?? $this->accessUserData(); - } - - /** - * Return true if the currently logged-in user is the one provided - * (or if that user is Admin). - * - * @param int $userId - * - * @return bool - */ - public function is_current_user_or_admin(int $userId): bool - { - return $this->is_logged_in() && (Session::get('UserID') === $userId || Session::get('UserID') === 0); - } - - /** - * Given a user, login. - */ - public function login(User $user): void - { - $this->user_data = $user; - Session::put('login', true); - Session::put('UserID', $user->id); - } - - /** - * Sets the session values when no there is no username and password in the database. - * - * @return bool returns true when no login was found - */ - public function noLogin(): bool - { - /** @var User|null $adminUser */ - $adminUser = User::query()->find(0); - if ($adminUser !== null && $adminUser->password === '' && $adminUser->username === '') { - $this->user_data = $adminUser; - Session::put('login', true); - Session::put('UserID', 0); - - return true; - } - - return Legacy::noLogin(); - } - - /** - * Given a username, password and ip (for logging), try to log the user. - * Returns true if succeeded, false if failed. - * - * @param string $username - * @param string $password - * @param string $ip - * - * @return bool - */ - public function log_as_user(string $username, string $password, string $ip): bool - { - // We select the NON ADMIN user - /** @var User|null $user */ - $user = User::query()->where('username', '=', $username)->where('id', '>', '0')->first(); - - if ($user !== null && Hash::check($password, $user->password)) { - $this->user_data = $user; - Session::put('login', true); - Session::put('UserID', $user->id); - Logs::notice(__METHOD__, __LINE__, 'User (' . $username . ') has logged in from ' . $ip); - - return true; - } - - return false; - } - - /** - * Given a username, password and ip (for logging), try to log the user as admin. - * Returns true if succeeded, false if failed. - * - * @param string $username - * @param string $password - * @param string $ip - * - * @return bool - */ - public function log_as_admin(string $username, string $password, string $ip): bool - { - /** @var User|null $adminUser */ - $adminUser = User::query()->find(0); - - if ($adminUser !== null) { - // Admin User exist, so we check against it. - if (Hash::check($username, $adminUser->username) && Hash::check($password, $adminUser->password)) { - $this->user_data = $adminUser; - Session::put('login', true); - Session::put('UserID', 0); - Logs::notice(__METHOD__, __LINE__, 'User (' . $username . ') has logged in from ' . $ip); - - return true; - } - - return false; - } - // Admin User does not exist yet, so we use the Legacy. - return Legacy::log_as_admin($username, $password, $ip); - } - - /** - * Log out the current user. - */ - public function logout(): void - { - $this->user_data = null; - Session::flush(); - } -} diff --git a/app/Models/BaseAlbumImpl.php b/app/Models/BaseAlbumImpl.php index a5ec5291af..a61f40575b 100644 --- a/app/Models/BaseAlbumImpl.php +++ b/app/Models/BaseAlbumImpl.php @@ -4,7 +4,6 @@ use App\Contracts\HasRandomID; use App\DTO\PhotoSortingCriterion; -use App\Facades\AccessControl; use App\Models\Extensions\HasAttributesPatch; use App\Models\Extensions\HasBidirectionalRelationships; use App\Models\Extensions\HasRandomIDAndLegacyTimeBasedID; @@ -16,6 +15,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Support\Facades\Auth; /** * Class BaseAlbumImpl. @@ -274,7 +274,7 @@ protected function setSortingAttribute(?PhotoSortingCriterion $sorting): void public function toArray(): array { $result = parent::toArray(); - if (AccessControl::is_logged_in()) { + if (Auth::check()) { $result['owner_name'] = $this->owner->name(); } diff --git a/app/Models/Photo.php b/app/Models/Photo.php index f4291c145b..ebedad725f 100644 --- a/app/Models/Photo.php +++ b/app/Models/Photo.php @@ -12,7 +12,6 @@ use App\Exceptions\Internal\ZeroModuloException; use App\Exceptions\MediaFileOperationException; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; use App\Facades\Helpers; use App\Image\MediaFile; use App\Models\Extensions\HasAttributesPatch; @@ -22,12 +21,14 @@ use App\Models\Extensions\ThrowsConsistentExceptions; use App\Models\Extensions\UseFixedQueryBuilder; use App\Models\Extensions\UTCBasedTimes; +use App\Policies\PhotoPolicy; use App\Relations\HasManySizeVariants; use App\Relations\LinkedPhotoCollection; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Storage; use function Safe\preg_match; @@ -336,7 +337,7 @@ protected function getLivePhotoUrlAttribute(): ?string protected function getIsDownloadableAttribute(): bool { return - AccessControl::is_current_user_or_admin($this->owner_id) || + Gate::check(PhotoPolicy::IS_OWNER, $this) || ($this->album_id !== null && $this->album->is_downloadable) || ($this->album_id === null && Configs::getValueAsBool('downloadable')); } @@ -356,7 +357,7 @@ protected function getIsShareButtonVisibleAttribute(): bool $default = Configs::getValueAsBool('share_button_visible'); return - AccessControl::is_current_user_or_admin($this->owner_id) || + Gate::check(PhotoPolicy::IS_OWNER, $this) || ($this->album_id !== null && $this->album->is_share_button_visible) || ($this->album_id === null && $default); } @@ -441,7 +442,7 @@ public function toArray(): array // The decision logic here is a merge of three formerly independent // (and slightly different) approaches if ( - !AccessControl::is_current_user_or_admin($this->owner_id) && + !Gate::check(PhotoPolicy::IS_OWNER, $this) && !$this->isVideo() && ($result['size_variants']['medium2x'] !== null || $result['size_variants']['medium'] !== null) && ( diff --git a/app/Models/SizeVariant.php b/app/Models/SizeVariant.php index 5b34f00f7c..930534e500 100644 --- a/app/Models/SizeVariant.php +++ b/app/Models/SizeVariant.php @@ -9,17 +9,19 @@ use App\Exceptions\Internal\InvalidSizeVariantException; use App\Exceptions\MediaFileOperationException; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; use App\Image\FlysystemFile; use App\Models\Extensions\HasAttributesPatch; use App\Models\Extensions\HasBidirectionalRelationships; use App\Models\Extensions\ThrowsConsistentExceptions; use App\Models\Extensions\UseFixedQueryBuilder; use App\Models\Extensions\UTCBasedTimes; +use App\Policies\UserPolicy; use App\Relations\HasManyBidirectionally; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Storage; use League\Flysystem\Adapter\Local; // TODO: Uncomment the following line, if Lychee really starts to support AWS s3. @@ -155,7 +157,7 @@ public function getUrlAttribute(): string $imageDisk = SizeVariantNamingStrategy::getImageDisk(); if ( - AccessControl::is_admin() && !Configs::getValueAsBool('SL_for_admin') || + Gate::check(UserPolicy::IS_ADMIN) && !Configs::getValueAsBool('SL_for_admin') || !Configs::getValueAsBool('SL_enable') ) { return $imageDisk->url($this->short_path); diff --git a/app/Models/User.php b/app/Models/User.php index c22a84aa28..c7820dbbb8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,7 +3,7 @@ namespace App\Models; use App\Exceptions\ModelDBException; -use App\Facades\AccessControl; +use App\Exceptions\UnauthenticatedException; use App\Models\Extensions\ThrowsConsistentExceptions; use App\Models\Extensions\UseFixedQueryBuilder; use App\Models\Extensions\UTCBasedTimes; @@ -18,6 +18,8 @@ use Illuminate\Notifications\DatabaseNotificationCollection; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Auth; +use function Safe\substr; /** * App\Models\User. @@ -112,11 +114,6 @@ public function shared(): BelongsToMany ); } - public function is_admin(): bool - { - return $this->id === 0; - } - /** * Used by Larapass. * @@ -134,7 +131,8 @@ public function username(): string */ public function name(): string { - return ($this->id === 0) ? 'Admin' : $this->username; + // If strings starts by '$2y$', it is very likely that it's a blowfish hash. + return substr($this->username, 0, 4) === '$2y$' ? 'Admin' : $this->username; } /** @@ -148,11 +146,12 @@ public function name(): string * * @throws ModelDBException * @throws InvalidFormatException + * @throws UnauthenticatedException */ public function delete(): bool { $now = Carbon::now(); - $newOwnerID = AccessControl::id(); + $newOwnerID = Auth::id() ?? throw new UnauthenticatedException(); /** @var HasMany[] $ownershipRelations */ $ownershipRelations = [$this->photos(), $this->albums()]; diff --git a/app/Policies/AlbumPolicy.php b/app/Policies/AlbumPolicy.php new file mode 100644 index 0000000000..1fe85ba1fc --- /dev/null +++ b/app/Policies/AlbumPolicy.php @@ -0,0 +1,277 @@ +userPolicy = resolve(UserPolicy::class); + } catch (BindingResolutionException $e) { + throw new FrameworkException('Laravel\'s provider component', $e); + } + } + + /** + * Perform pre-authorization checks. + * + * @param \App\Models\User $user + * @param string $ability + * + * @return void|bool + */ + public function before(?User $user, $ability) + { + if ($this->userPolicy->isAdmin($user)) { + return true; + } + } + + /** + * This gate policy ensures that the Album is owned by current user. + * Do note that in case of current user being admin, it will be skipped due to the before method. + * + * @param User|null $user + * @param BaseAlbum $album + * + * @return bool + */ + public function isOwner(?User $user, BaseAlbum $album): bool + { + return $user !== null && $album->owner_id === $user->id; + } + + /** + * Checks whether the album is accessible by the current user. + * + * A real albums (i.e. albums that are stored in the DB) is called + * _accessible_ if the current user is allowed to browse into it, i.e. if + * the current user may open it and see its content. + * An album is _accessible_ if any of the following conditions hold + * (OR-clause) + * + * - the user is an admin + * - the user is the owner of the album + * - the album is shared with the user + * - the album is public AND no password is set + * - the album is public AND has been unlocked + * + * In other cases, the following holds: + * - the root album is accessible by everybody + * - the built-in smart albums are accessible, if + * - the user is authenticated and is granted the right of uploading, or + * - the album is public + * + * @param User|null $user + * @param AbstractAlbum|null $album + * + * @return bool + * + * @throws LycheeAssertionError + */ + public function canAccess(?User $user, ?AbstractAlbum $album): bool + { + if ($album === null) { + return true; + } + + if ($album instanceof BaseAlbum) { + try { + return + $this->isOwner($user, $album) || + ($album->is_public && $album->password === null) || + ($album->is_public && $this->isUnlocked($album)) || + ($album->shared_with()->where('user_id', '=', $user?->id)->count() > 0); + } catch (\InvalidArgumentException $e) { + throw LycheeAssertionError::createFromUnexpectedException($e); + } + } elseif ($album instanceof BaseSmartAlbum) { + return $this->isVisible($user, $album); + } else { + // Should never happen + return false; + } + } + + /** + * Check if an album is dowmloadable. + * + * @param User|null $user + * @param BaseAlbum|null $baseAlbum + * + * @return bool + * + * @throws ConfigurationKeyMissingException + */ + public function canDownload(?User $user, ?BaseAlbum $baseAlbum): bool + { + if ($baseAlbum === null) { + return Configs::getValueAsBool('downloadable'); + } + + return $this->isOwner($user, $baseAlbum) || + $baseAlbum->is_downloadable; + } + + /** + * Checks whether the album is editable by the current user. + * + * An album is called _editable_ if the current user is allowed to edit + * the album's properties. + * This also covers adding new photos to an album. + * An album is _editable_ if any of the following conditions hold + * (OR-clause) + * + * - the user is an admin + * - the user has the upload privilege and is the owner of the album + * + * Note about built-in smart albums: + * The built-in smart albums (starred, public, recent, unsorted) do not + * have any editable properties. + * Hence, it is pointless whether a smart album is editable or not. + * In order to silently ignore/skip this condition for smart albums, + * this method always returns `true` for a smart album. + * + * @param User $user + * @param AbstractAlbum|null $album the album; `null` designates the root album + * + * @return bool + */ + public function canEdit(User $user, ?AbstractAlbum $album): bool + { + if (!$this->userPolicy->canUpload($user)) { + return false; + } + + // The root album and smart albums get a pass + return + $album === null || + $album instanceof BaseSmartAlbum || + ($album instanceof BaseAlbum && $this->isOwner($user, $album)); + } + + /** + * Checks whether the album is visible by the current user. + * + * Note, at the moment this check is only needed for built-in smart + * albums. + * Hence, the method is only provided for them. + * + * @param User|null $user + * @param BaseSmartAlbum $smartAlbum + * + * @return bool true, if the album is visible + */ + public function isVisible(?User $user, BaseSmartAlbum $smartAlbum): bool + { + return ($user !== null && $this->userPolicy->canUpload($user)) || + $smartAlbum->is_public; + } + + /** + * Checks whether the designated albums are editable by the current user. + * + * See {@link AlbumQueryPolicy::isEditable()} for the definition + * when an album is editable. + * + * This method is mostly only useful during deletion of albums, when no + * album models are loaded for efficiency reasons. + * If an album model is required anyway (because it shall be edited), + * then first load the album once and use + * {@link AlbumQueryPolicy::isEditable()} + * instead in order to avoid several DB requests. + * + * @param User $user + * @param array $albumIDs + * + * @return bool + * + * @throws QueryBuilderException + */ + public function canEditById(User $user, array $albumIDs): bool + { + if (!$this->userPolicy->canUpload($user)) { + return false; + } + + // Remove root and smart albums, as they get a pass. + // Make IDs unique as otherwise count will fail. + $albumIDs = array_diff( + array_unique($albumIDs), + array_keys(AlbumFactory::BUILTIN_SMARTS), + [null] + ); + + return + count($albumIDs) === 0 || + BaseAlbumImpl::query() + ->whereIn('id', $albumIDs) + ->where('owner_id', $user->id) + ->count() === count($albumIDs); + } + + // The following methods are not to be called by Gate. + + /** + * Pushes an album onto the stack of unlocked albums. + * + * @param BaseAlbum|BaseAlbumImpl $album + */ + public function unlock(BaseAlbum|BaseAlbumImpl $album): void + { + Session::push(AlbumPolicy::UNLOCKED_ALBUMS_SESSION_KEY, $album->id); + } + + /** + * Check whether the given album has previously been unlocked. + * + * @param BaseAlbum|BaseAlbumImpl $album + * + * @return bool + */ + public function isUnlocked(BaseAlbum|BaseAlbumImpl $album): bool + { + return in_array($album->id, $this->getUnlockedAlbumIDs(), true); + } + + /** + * @return string[] + */ + public function getUnlockedAlbumIDs(): array + { + return Session::get(self::UNLOCKED_ALBUMS_SESSION_KEY, []); + } +} diff --git a/app/Actions/AlbumAuthorisationProvider.php b/app/Policies/AlbumQueryPolicy.php similarity index 67% rename from app/Actions/AlbumAuthorisationProvider.php rename to app/Policies/AlbumQueryPolicy.php index c103bc5a81..6f4a68952d 100644 --- a/app/Actions/AlbumAuthorisationProvider.php +++ b/app/Policies/AlbumQueryPolicy.php @@ -1,39 +1,36 @@ albumFactory = $albumFactory; + $this->albumPolicy = $albumPolicy; } /** @@ -59,11 +56,11 @@ public function applyVisibilityFilter(AlbumBuilder|FixedQueryBuilder $query): Al { $this->prepareModelQueryOrFail($query); - if (AccessControl::is_admin()) { + if (Gate::check(UserPolicy::IS_ADMIN)) { return $query; } - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $userID = Auth::id(); // We must wrap everything into an outer query to avoid any undesired // effects in case that the original query already contains an @@ -95,7 +92,7 @@ public function applyVisibilityFilter(AlbumBuilder|FixedQueryBuilder $query): Al * Adds the conditions of an accessible album to the query. * * **Attention:** This method is only meant for internal use by - * this class or {@link PhotoAuthorisationProvider}. + * this class or {@link PhotoQueryPolicy}. * * This method adds the WHERE conditions without any further pre-cautions. * The method silently assumes that the SELECT clause contains the tables @@ -114,8 +111,8 @@ public function applyVisibilityFilter(AlbumBuilder|FixedQueryBuilder $query): Al */ public function appendAccessibilityConditions(BaseBuilder $query): BaseBuilder { - $unlockedAlbumIDs = $this->getUnlockedAlbumIDs(); - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $unlockedAlbumIDs = $this->albumPolicy->getUnlockedAlbumIDs(); + $userID = Auth::id(); try { $query @@ -171,12 +168,12 @@ public function applyReachabilityFilter(AlbumBuilder $query): AlbumBuilder { $this->prepareModelQueryOrFail($query); - if (AccessControl::is_admin()) { + if (Gate::check(UserPolicy::IS_ADMIN)) { return $query; } - $unlockedAlbumIDs = $this->getUnlockedAlbumIDs(); - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $unlockedAlbumIDs = $this->albumPolicy->getUnlockedAlbumIDs(); + $userID = Auth::id(); // We must wrap everything into an outer query to avoid any undesired // effects in case that the original query already contains an @@ -211,57 +208,6 @@ public function applyReachabilityFilter(AlbumBuilder $query): AlbumBuilder return $query->where($reachabilitySubQuery); } - /** - * Checks whether the album is accessible by the current user. - * - * A real albums (i.e. albums that are stored in the DB) is called - * _accessible_ if the current user is allowed to browse into it, i.e. if - * the current user may open it and see its content. - * An album is _accessible_ if any of the following conditions hold - * (OR-clause) - * - * - the user is an admin - * - the user is the owner of the album - * - the album is shared with the user - * - the album is public AND no password is set - * - the album is public AND has been unlocked - * - * In other cases, the following holds: - * - the root album is accessible by everybody - * - the built-in smart albums are accessible, if - * - the user is authenticated and is granted the right of uploading, or - * - the album is public - * - * @param AbstractAlbum|null $album - * - * @return bool - */ - public function isAccessible(?AbstractAlbum $album): bool - { - if ($album === null || AccessControl::is_admin()) { - return true; - } - - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; - - if ($album instanceof BaseAlbum) { - try { - return - ($album->owner_id === $userID) || - ($album->is_public && $album->password === null) || - ($album->is_public && $this->isUnlocked($album)) || - ($album->shared_with()->where('user_id', '=', $userID)->count() > 0); - } catch (\InvalidArgumentException $e) { - throw LycheeAssertionError::createFromUnexpectedException($e); - } - } elseif ($album instanceof BaseSmartAlbum) { - return AccessControl::can_upload() || $album->is_public; - } else { - // Should never happen - return false; - } - } - /** * Restricts an album query to _browsable_ albums. * @@ -272,7 +218,7 @@ public function isAccessible(?AbstractAlbum $album): bool * 1. there is a path from the origin to the album, and * 2. all albums on the path are _reachable_ * - * See {@link AlbumAuthorisationProvider::applyReachabilityFilter()} + * See {@link AlbumQueryPolicy::applyReachabilityFilter()} * for the definition of reachability. * Note, while _reachability_ (as well as _visibility_ and _accessibility_) * are a _local_ properties, _browsability_ is a _global_ property. @@ -311,7 +257,7 @@ public function applyBrowsabilityFilter(AlbumBuilder $query): AlbumBuilder throw new LycheeInvalidArgumentException('the given query does not query for albums'); } - if (AccessControl::is_admin()) { + if (Gate::check(UserPolicy::IS_ADMIN)) { return $query; } @@ -329,8 +275,8 @@ public function applyBrowsabilityFilter(AlbumBuilder $query): AlbumBuilder * Adds the conditions of an unreachable album to the query. * * **Attention:** This method is only meant for internal use by - * this class or {@link PhotoAuthorisationProvider}. - * Use {@link AlbumAuthorisationProvider::applyBrowsabilityFilter()} + * this class or {@link PhotoQueryPolicy}. + * Use {@link AlbumQueryPolicy::applyBrowsabilityFilter()} * if called from other places instead. * * This method adds the WHERE conditions without any further pre-cautions. @@ -364,8 +310,8 @@ public function appendUnreachableAlbumsCondition(BaseBuilder $builder, int|strin throw new LycheeInvalidArgumentException('$originLeft and $originRight must simultaneously either be integers, strings or null'); } - $unlockedAlbumIDs = $this->getUnlockedAlbumIDs(); - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $unlockedAlbumIDs = $this->albumPolicy->getUnlockedAlbumIDs(); + $userID = Auth::id(); try { // There are inner albums ... @@ -427,128 +373,6 @@ public function appendUnreachableAlbumsCondition(BaseBuilder $builder, int|strin } } - /** - * Pushes an album onto the stack of unlocked albums. - * - * @param BaseAlbum|BaseAlbumImpl $album - */ - public function unlock(BaseAlbum|BaseAlbumImpl $album): void - { - Session::push(self::UNLOCKED_ALBUMS_SESSION_KEY, $album->id); - } - - /** - * Check whether the given album has previously been unlocked. - * - * @param BaseAlbum|BaseAlbumImpl $album - * - * @return bool - */ - public function isUnlocked(BaseAlbum|BaseAlbumImpl $album): bool - { - return in_array($album->id, $this->getUnlockedAlbumIDs(), true); - } - - private function getUnlockedAlbumIDs(): array - { - return Session::get(self::UNLOCKED_ALBUMS_SESSION_KEY, []); - } - - /** - * Checks whether the album is editable by the current user. - * - * An album is called _editable_ if the current user is allowed to edit - * the album's properties. - * This also covers adding new photos to an album. - * An album is _editable_ if any of the following conditions hold - * (OR-clause) - * - * - the user is an admin - * - the user has the upload privilege and is the owner of the album - * - * Note about built-in smart albums: - * The built-in smart albums (starred, public, recent, unsorted) do not - * have any editable properties. - * Hence, it is pointless whether a smart album is editable or not. - * In order to silently ignore/skip this condition for smart albums, - * this method always returns `true` for a smart album. - * - * @param AbstractAlbum|null $album the album; `null` designates the root album - * - * @return bool - */ - public function isEditable(?AbstractAlbum $album): bool - { - if (AccessControl::is_admin()) { - return true; - } - if (!AccessControl::is_logged_in()) { - return false; - } - - $user = AccessControl::user(); - - if (!$user->may_upload) { - return false; - } - - // The root album and smart albums get a pass - return - $album === null || - $album instanceof BaseSmartAlbum || - ($album instanceof BaseAlbum && $album->owner_id === $user->id); - } - - /** - * Checks whether the designated albums are editable by the current user. - * - * See {@link AlbumAuthorisationProvider::isEditable()} for the definition - * when an album is editable. - * - * This method is mostly only useful during deletion of albums, when no - * album models are loaded for efficiency reasons. - * If an album model is required anyway (because it shall be edited), - * then first load the album once and use - * {@link AlbumAuthorisationProvider::isEditable()} - * instead in order to avoid several DB requests. - * - * @param array $albumIDs - * - * @return bool - * - * @throws QueryBuilderException - */ - public function areEditableByIDs(array $albumIDs): bool - { - if (AccessControl::is_admin()) { - return true; - } - if (!AccessControl::is_logged_in()) { - return false; - } - - $user = AccessControl::user(); - - if (!$user->may_upload) { - return false; - } - - // Remove root and smart albums, as they get a pass. - // Make IDs unique as otherwise count will fail. - $albumIDs = array_diff( - array_unique($albumIDs), - array_keys(AlbumFactory::BUILTIN_SMARTS), - [null] - ); - - return - count($albumIDs) === 0 || - BaseAlbumImpl::query() - ->whereIn('id', $albumIDs) - ->where('owner_id', $user->id) - ->count() === count($albumIDs); - } - /** * Throws an exception if the given query does not query for an album. * @@ -584,8 +408,8 @@ private function prepareModelQueryOrFail(AlbumBuilder|FixedQueryBuilder $query): $query->join('base_albums', 'base_albums.id', '=', $table . '.id'); } - if (AccessControl::is_logged_in()) { - $userID = AccessControl::id(); + $userID = Auth::id(); + if ($userID !== null) { // We must left join with `user_base_album` if and only if we // restrict the eventual query to the ID of the authenticated // user by a `WHERE`-clause. @@ -605,22 +429,4 @@ function (JoinClause $join) use ($userID) { ); } } - - /** - * Checks whether the album is visible by the current user. - * - * Note, at the moment this check is only needed for built-in smart - * albums. - * Hence, the method is only provided for them. - * - * @param BaseSmartAlbum $smartAlbum - * - * @return bool true, if the album is visible - */ - public function isVisible(BaseSmartAlbum $smartAlbum): bool - { - return - (AccessControl::is_logged_in() && AccessControl::can_upload()) || - $smartAlbum->is_public; - } } diff --git a/app/Policies/PhotoPolicy.php b/app/Policies/PhotoPolicy.php new file mode 100644 index 0000000000..0b962997e3 --- /dev/null +++ b/app/Policies/PhotoPolicy.php @@ -0,0 +1,178 @@ +albumPolicy = resolve(AlbumPolicy::class); + $this->userPolicy = resolve(UserPolicy::class); + } catch (BindingResolutionException $e) { + throw new FrameworkException('Laravel\'s provider component', $e); + } + } + + /** + * Perform pre-authorization checks. + * + * @param \App\Models\User $user + * @param string $ability + * + * @return void|bool + */ + public function before(?User $user, $ability) + { + if ($this->userPolicy->isAdmin($user)) { + return true; + } + } + + /** + * This gate policy ensures that the Photo is owned by current user. + * Do note that in case of current user being admin, it will be skipped due to the before method. + * + * @param User|null $user + * @param Photo $photo + * + * @return bool + */ + public function isOwner(?User $user, Photo $photo): bool + { + return $user !== null && $photo->owner_id === $user->id; + } + + /** + * Defines whether the photo is visible to the current user. + * + * @param User|null $user + * @param Photo $photo + * + * @return bool + */ + public function isVisible(?User $user, Photo $photo): bool + { + return $this->isOwner($user, $photo) || + $photo->is_public || + ( + $photo->album !== null && + $this->albumPolicy->canAccess($user, $photo->album) + ); + } + + /** + * Checks whether the photo may be downloaded by the current user. + * + * Previously, this code was part of {@link Archive::extractFileInfo()}. + * In particular, the method threw to {@link UnauthorizedException} with + * custom error messages: + * + * - `'User is not allowed to download the image'`, if the user was not + * the owner, the user was allowed to see the photo (i.e. the album + * is shared with the user), but the album does not allow to dowload + * photos + * - `'Permission to download is disabled by configuration'`, if the + * user was not the owner, the photo was not part of any album (i.e. + * unsorted), the photo was public and downloading was disabled by + * configuration. + * + * TODO: Check if these custom error messages are still needed. If yes, consider not to return a boolean value but rename the method to `assert...` and throw exceptions with custom error messages. + * + * @param User|null $user + * @param Photo $photo + * + * @return bool + */ + public function canDownload(?User $user, Photo $photo): bool + { + if ($this->isOwner($user, $photo)) { + return true; + } + + if (!$this->isVisible($user, $photo)) { + return false; + } + + return $this->albumPolicy->canDownload($user, $photo->album); + } + + /** + * Checks whether the photo is editable by the current user. + * + * A photo is called _editable_ if the current user is allowed to edit + * the photo's properties. + * A photo is _editable_ if any of the following conditions hold + * (OR-clause) + * + * - the user is an admin + * - the user is the owner of the photo + * + * @param Photo $photo + * + * @return bool + */ + public function canEdit(User $user, Photo $photo) + { + return $this->isOwner($user, $photo); + } + + /** + * Checks whether the designated photos are editable by the current user. + * + * See {@link PhotoQueryPolicy::isEditable()} for the definition + * when a photo is editable. + * + * This method is mostly only useful during deletion of photos, when no + * photo models are loaded for efficiency reasons. + * If a photo model is required anyway (because it shall be edited), + * then first load the photo once and use + * {@link PhotoQueryPolicy::isEditable()} + * instead in order to avoid several DB requests. + * + * @param User $user + * @param string[] $photoIDs + * + * @return bool + * + * @throws QueryBuilderException + */ + public function canEditById(User $user, array $photoIDs): bool + { + if (!$this->userPolicy->canUpload($user)) { + return false; + } + + // Make IDs unique as otherwise count will fail. + $photoIDs = array_unique($photoIDs); + + return + count($photoIDs) === 0 || + Photo::query() + ->whereIn('id', $photoIDs) + ->where('owner_id', $user->id) + ->count() === count($photoIDs); + } +} diff --git a/app/Actions/PhotoAuthorisationProvider.php b/app/Policies/PhotoQueryPolicy.php similarity index 60% rename from app/Actions/PhotoAuthorisationProvider.php rename to app/Policies/PhotoQueryPolicy.php index b193b60b1b..83b0d5cbba 100644 --- a/app/Actions/PhotoAuthorisationProvider.php +++ b/app/Policies/PhotoQueryPolicy.php @@ -1,13 +1,10 @@ albumAuthorisationProvider = resolve(AlbumAuthorisationProvider::class); + $this->albumQueryPolicy = resolve(AlbumQueryPolicy::class); } /** @@ -36,7 +35,7 @@ public function __construct() * - the user is the admin * - the user is the owner of the photo * - the photo is part of an album which the user is allowed to access - * (cp. {@link AlbumAuthorisationProvider::isAccessible()}). + * (cp. {@link AlbumQueryPolicy::isAccessible()}). * - the photo is public * * @param FixedQueryBuilder $query @@ -49,87 +48,26 @@ public function applyVisibilityFilter(FixedQueryBuilder $query): FixedQueryBuild { $this->prepareModelQueryOrFail($query, false, true, true); - if (AccessControl::is_admin()) { + if (Gate::check(UserPolicy::IS_ADMIN)) { return $query; } - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $userId = Auth::id(); // We must wrap everything into an outer query to avoid any undesired // effects in case that the original query already contains an // "OR"-clause. - $visibilitySubQuery = function (FixedQueryBuilder $query2) use ($userID) { - $this->albumAuthorisationProvider->appendAccessibilityConditions($query2->getQuery()); + $visibilitySubQuery = function (FixedQueryBuilder $query2) use ($userId) { + $this->albumQueryPolicy->appendAccessibilityConditions($query2->getQuery()); $query2->orWhere('photos.is_public', '=', true); - if ($userID !== null) { - $query2->orWhere('photos.owner_id', '=', $userID); + if ($userId !== null) { + $query2->orWhere('photos.owner_id', '=', $userId); } }; return $query->where($visibilitySubQuery); } - /** - * Checks whether the photo is visible by the current user. - * - * See {@link PhotoAuthorisationProvider::applyVisibilityFilter()} for a - * specification of the rules when a photo is visible. - * - * @param Photo|null $photo the photo; `null` is accepted for convenience - * and the `null` photo is always authorized - * - * @return bool true, if the authenticated user is authorized - */ - public function isVisible(?Photo $photo): bool - { - // We must explicitly check that the photo is not unsorted before - // checking whether the parent album is accessible, because the root - // album always is accessible and gets a pass. - // However, we do not want every unsorted photo to be publicly - // visible. - return - $photo === null || - AccessControl::is_current_user_or_admin($photo->owner_id) || - $photo->is_public || ( - $photo->album !== null && - $this->albumAuthorisationProvider->isAccessible($photo->album) - ); - } - - /** - * Checks whether the photo may be downloaded by the current user. - * - * Previously, this code was part of {@link Archive::extractFileInfo()}. - * In particular, the method threw to {@link UnauthorizedException} with - * custom error messages: - * - * - `'User is not allowed to download the image'`, if the user was not - * the owner, the user was allowed to see the photo (i.e. the album - * is shared with the user), but the album does not allow to dowload - * photos - * - `'Permission to download is disabled by configuration'`, if the - * user was not the owner, the photo was not part of any album (i.e. - * unsorted), the photo was public and downloading was disabled by - * configuration. - * - * TODO: Check if these custom error messages are still needed. If yes, consider not to return a boolean value but rename the method to `assert...` and throw exceptions with custom error messages. - * - * @param Photo $photo - * - * @return bool - */ - public function isDownloadable(Photo $photo): bool - { - if (!$this->isVisible($photo)) { - return false; - } - - return - AccessControl::is_current_user_or_admin($photo->owner_id) || - $photo->album?->is_downloadable || - ($photo->album === null && Configs::getValueAsBool('downloadable')); - } - /** * Restricts a photo query to _searchable_ photos. * @@ -140,7 +78,7 @@ public function isDownloadable(Photo $photo): bool * - the user is the owner of the photo * - the photo is public and searching through public photos is enabled * - * See {@link AlbumAuthorisationProvider::applyBrowsabilityFilter()} + * See {@link AlbumQueryPolicy::applyBrowsabilityFilter()} * for a definition of a browsable album. * * The search result is restricted to photos in albums which are below @@ -174,7 +112,7 @@ public function applySearchabilityFilter(FixedQueryBuilder $query, ?Album $origi ->where('albums._rgt', '<=', $origin->_rgt); } - if (AccessControl::is_admin()) { + if (Gate::check(UserPolicy::IS_ADMIN)) { return $query; } else { return $query->where(function (Builder $query) use ($origin) { @@ -191,7 +129,7 @@ public function applySearchabilityFilter(FixedQueryBuilder $query, ?Album $origi * Adds the conditions of _searchable_ photos to the query. * * **Attention:** This method is only meant for internal use. - * Use {@link PhotoAuthorisationProvider::applySearchabilityFilter()} + * Use {@link PhotoQueryPolicy::applySearchabilityFilter()} * if called from other places instead. * * This method adds the WHERE conditions without any further pre-cautions. @@ -199,7 +137,7 @@ public function applySearchabilityFilter(FixedQueryBuilder $query, ?Album $origi * * - **`albums`**. * - * See {@link AlbumAuthorisationProvider::applySearchabilityFilter()} + * See {@link AlbumQueryPolicy::applySearchabilityFilter()} * for a definition of a searchable photo. * * Moreover, the raw clauses are added. @@ -223,13 +161,13 @@ public function applySearchabilityFilter(FixedQueryBuilder $query, ?Album $origi */ public function appendSearchabilityConditions(BaseBuilder $query, int|string|null $originLeft, int|string|null $originRight): BaseBuilder { - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $userId = Auth::id(); $maySearchPublic = !Configs::getValueAsBool('public_photos_hidden'); try { // there must be no unreachable album between the origin and the photo $query->whereNotExists(function (BaseBuilder $q) use ($originLeft, $originRight) { - $this->albumAuthorisationProvider->appendUnreachableAlbumsCondition($q, $originLeft, $originRight); + $this->albumQueryPolicy->appendUnreachableAlbumsCondition($q, $originLeft, $originRight); }); // Special care needs to be taken for unsorted photo, i.e. photos on @@ -247,8 +185,8 @@ public function appendSearchabilityConditions(BaseBuilder $query, int|string|nul if ($maySearchPublic) { $query->orWhere('photos.is_public', '=', true); } - if ($userID !== null) { - $query->orWhere('photos.owner_id', '=', $userID); + if ($userId !== null) { + $query->orWhere('photos.owner_id', '=', $userId); } } catch (\Throwable $e) { throw new QueryBuilderException($e); @@ -257,67 +195,6 @@ public function appendSearchabilityConditions(BaseBuilder $query, int|string|nul return $query; } - /** - * Checks whether the photo is editable by the current user. - * - * A photo is called _editable_ if the current user is allowed to edit - * the photo's properties. - * A photo is _editable_ if any of the following conditions hold - * (OR-clause) - * - * - the user is an admin - * - the user is the owner of the photo - * - * @param Photo $photo - * - * @return bool - */ - public function isEditable(Photo $photo): bool - { - return AccessControl::is_current_user_or_admin($photo->owner_id); - } - - /** - * Checks whether the designated photos are editable by the current user. - * - * See {@link PhotoAuthorisationProvider::isEditable()} for the definition - * when a photo is editable. - * - * This method is mostly only useful during deletion of photos, when no - * photo models are loaded for efficiency reasons. - * If a photo model is required anyway (because it shall be edited), - * then first load the photo once and use - * {@link PhotoAuthorisationProvider::isEditable()} - * instead in order to avoid several DB requests. - * - * @param string[] $photoIDs - * - * @return bool - * - * @throws QueryBuilderException - */ - public function areEditableByIDs(array $photoIDs): bool - { - if (AccessControl::is_admin()) { - return true; - } - if (!AccessControl::is_logged_in()) { - return false; - } - - $user = AccessControl::user(); - - // Make IDs unique as otherwise count will fail. - $photoIDs = array_unique($photoIDs); - - return - count($photoIDs) === 0 || - Photo::query() - ->whereIn('id', $photoIDs) - ->where('owner_id', $user->id) - ->count() === count($photoIDs); - } - /** * Throws an exception if the given query does not query for a photo. * @@ -346,7 +223,7 @@ private function prepareModelQueryOrFail(FixedQueryBuilder $query, bool $addAlbu // Hence, we must restrict the `LEFT JOIN` to the user ID which // is also used in the outer `WHERE`-clause. // See `applyVisibilityFilter`. - $addShares = $addShares && AccessControl::is_logged_in(); + $addShares = $addShares && Auth::check(); // Ensure that only columns of the photos are selected, // if no specific columns are yet set. @@ -363,13 +240,13 @@ private function prepareModelQueryOrFail(FixedQueryBuilder $query, bool $addAlbu $query->leftJoin('base_albums', 'base_albums.id', '=', 'photos.album_id'); } if ($addShares) { - $userID = AccessControl::id(); + $userId = Auth::id(); $query->leftJoin( 'user_base_album', - function (JoinClause $join) use ($userID) { + function (JoinClause $join) use ($userId) { $join ->on('user_base_album.base_album_id', '=', 'base_albums.id') - ->where('user_base_album.user_id', '=', $userID); + ->where('user_base_album.user_id', '=', $userId); } ); } diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php new file mode 100644 index 0000000000..28d033bfdf --- /dev/null +++ b/app/Policies/UserPolicy.php @@ -0,0 +1,66 @@ +isAdmin($user)) { + return true; + } + } + + /** + * This defines if the user is admin. + * + * @param User|null $user + * + * @return bool + */ + public function isAdmin(?User $user): bool + { + return $user?->id === 0; + } + + /** + * This defines if user can edit their settings. + * + * @param User $user + * + * @return bool + */ + public function canEditSettings(User $user): bool + { + return !$user->is_locked; + } + + /** + * This defines if user has upload rights. + * + * @param User $user + * + * @return bool + */ + public function canUpload(User $user): bool + { + return $user->may_upload; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3722de0d9d..e646c3ab07 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,8 +2,6 @@ namespace App\Providers; -use App\Actions\AlbumAuthorisationProvider; -use App\Actions\PhotoAuthorisationProvider; use App\Actions\Update\Apply as ApplyUpdate; use App\Actions\Update\Check as CheckUpdate; use App\Assets\Helpers; @@ -19,8 +17,9 @@ use App\Metadata\GitRequest; use App\Metadata\LycheeVersion; use App\ModelFunctions\ConfigFunctions; -use App\ModelFunctions\SessionFunctions; use App\ModelFunctions\SymLinkFunctions; +use App\Policies\AlbumQueryPolicy; +use App\Policies\PhotoQueryPolicy; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; @@ -36,15 +35,14 @@ class AppServiceProvider extends ServiceProvider LangFactory::class => LangFactory::class, Lang::class => Lang::class, Helpers::class => Helpers::class, - SessionFunctions::class => SessionFunctions::class, GitRequest::class => GitRequest::class, GitHubFunctions::class => GitHubFunctions::class, LycheeVersion::class => LycheeVersion::class, CheckUpdate::class => CheckUpdate::class, ApplyUpdate::class => ApplyUpdate::class, AlbumFactory::class => AlbumFactory::class, - AlbumAuthorisationProvider::class => AlbumAuthorisationProvider::class, - PhotoAuthorisationProvider::class => PhotoAuthorisationProvider::class, + AlbumQueryPolicy::class => AlbumQueryPolicy::class, + PhotoQueryPolicy::class => PhotoQueryPolicy::class, ]; /** @@ -80,10 +78,6 @@ public function boot() */ public function register() { - $this->app->bind('AccessControl', function () { - return resolve(SessionFunctions::class); - }); - $this->app->bind('lang', function () { return resolve(Lang::class); }); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 7ef0bf8265..ececf60186 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,7 +2,18 @@ namespace App\Providers; +use App\Contracts\AbstractAlbum; +use App\Models\Album; +use App\Models\BaseAlbumImpl; +use App\Models\Extensions\BaseAlbum; +use App\Models\Photo; +use App\Models\User; +use App\Policies\AlbumPolicy; +use App\Policies\PhotoPolicy; +use App\Policies\UserPolicy; +use App\SmartAlbums\BaseSmartAlbum; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider { @@ -12,7 +23,16 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ - // 'App\Model' => 'App\Policies\ModelPolicy', + User::class => UserPolicy::class, + + Photo::class => PhotoPolicy::class, + + // This ensures that all the kinds of albums are covered in the Gate mapping. + BaseSmartAlbum::class => AlbumPolicy::class, + BaseAlbum::class => AlbumPolicy::class, + BaseAlbumImpl::class => AlbumPolicy::class, + Album::class => AlbumPolicy::class, + AbstractAlbum::class => AlbumPolicy::class, ]; /** @@ -23,5 +43,7 @@ class AuthServiceProvider extends ServiceProvider public function boot(): void { $this->registerPolicies(); + + Gate::define(UserPolicy::IS_ADMIN, [UserPolicy::class, 'isAdmin']); } } diff --git a/app/Relations/HasAlbumThumb.php b/app/Relations/HasAlbumThumb.php index 24d4a08e5f..0a4c7ca5f0 100644 --- a/app/Relations/HasAlbumThumb.php +++ b/app/Relations/HasAlbumThumb.php @@ -2,28 +2,31 @@ namespace App\Relations; -use App\Actions\AlbumAuthorisationProvider; -use App\Actions\PhotoAuthorisationProvider; use App\DTO\PhotoSortingCriterion; -use App\Facades\AccessControl; use App\Models\Album; use App\Models\Extensions\FixedQueryBuilder; use App\Models\Extensions\Thumb; use App\Models\Photo; +use App\Policies\AlbumPolicy; +use App\Policies\AlbumQueryPolicy; +use App\Policies\PhotoQueryPolicy; +use App\Policies\UserPolicy; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Database\Query\Builder as BaseBuilder; use Illuminate\Database\Query\JoinClause; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; /** * @mixin Builder */ class HasAlbumThumb extends Relation { - protected AlbumAuthorisationProvider $albumAuthorisationProvider; - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected AlbumQueryPolicy $albumQueryPolicy; + protected PhotoQueryPolicy $photoQueryPolicy; protected PhotoSortingCriterion $sorting; public function __construct(Album $parent) @@ -32,8 +35,8 @@ public function __construct(Album $parent) // the parent constructor. // The parent constructor calls `addConstraints` and thus our own // attributes must be initialized by then - $this->albumAuthorisationProvider = resolve(AlbumAuthorisationProvider::class); - $this->photoAuthorisationProvider = resolve(PhotoAuthorisationProvider::class); + $this->albumQueryPolicy = resolve(AlbumQueryPolicy::class); + $this->photoQueryPolicy = resolve(PhotoQueryPolicy::class); $this->sorting = PhotoSortingCriterion::createDefault(); parent::__construct( Photo::query()->with(['size_variants' => fn (HasMany $r) => Thumb::sizeVariantsFilter($r)]), @@ -69,7 +72,7 @@ public function addConstraints(): void if ($album->cover_id !== null) { $this->where('photos.id', '=', $album->cover_id); } else { - $this->photoAuthorisationProvider + $this->photoQueryPolicy ->applySearchabilityFilter($this->getRelationQuery(), $album); } } @@ -177,9 +180,9 @@ public function addEagerConstraints(array $models): void ->orderBy('photos.is_starred', 'desc') ->orderBy('photos.' . $this->sorting->column, $this->sorting->order) ->limit(1); - if (!AccessControl::is_admin()) { + if (!Gate::check(UserPolicy::IS_ADMIN)) { $bestPhotoIDSelect->where(function (Builder $query2) { - $this->photoAuthorisationProvider->appendSearchabilityConditions( + $this->photoQueryPolicy->appendSearchabilityConditions( $query2->getQuery(), 'covered_albums._lft', 'covered_albums._rgt' @@ -187,28 +190,28 @@ public function addEagerConstraints(array $models): void }); } - $userID = AccessControl::is_logged_in() ? AccessControl::id() : null; + $user = Auth::user(); - $album2Cover = function (BaseBuilder $builder) use ($bestPhotoIDSelect, $albumKeys, $userID) { + $album2Cover = function (BaseBuilder $builder) use ($bestPhotoIDSelect, $albumKeys, $user) { $builder ->from('albums as covered_albums') ->join('base_albums', 'base_albums.id', '=', 'covered_albums.id'); - if ($userID !== null) { + if ($user !== null) { $builder->leftJoin( 'user_base_album', - function (JoinClause $join) use ($userID) { + function (JoinClause $join) use ($user) { $join ->on('user_base_album.base_album_id', '=', 'base_albums.id') - ->where('user_base_album.user_id', '=', $userID); + ->where('user_base_album.user_id', '=', $user->id); } ); } $builder->select(['covered_albums.id AS album_id']) ->addSelect(['photo_id' => $bestPhotoIDSelect]) ->whereIn('covered_albums.id', $albumKeys); - if (!AccessControl::is_admin()) { + if (!Gate::check(UserPolicy::IS_ADMIN)) { $builder->where(function (BaseBuilder $q) { - $this->albumAuthorisationProvider->appendAccessibilityConditions($q); + $this->albumQueryPolicy->appendAccessibilityConditions($q); }); } }; @@ -286,7 +289,7 @@ public function getResults(): ?Thumb { /** @var Album|null $album */ $album = $this->parent; - if ($album === null || !$this->albumAuthorisationProvider->isAccessible($album)) { + if ($album === null || !Gate::check(AlbumPolicy::CAN_ACCESS, $album)) { return null; } diff --git a/app/Relations/HasManyChildAlbums.php b/app/Relations/HasManyChildAlbums.php index 09258690a5..4ba58d0c72 100644 --- a/app/Relations/HasManyChildAlbums.php +++ b/app/Relations/HasManyChildAlbums.php @@ -2,7 +2,6 @@ namespace App\Relations; -use App\Actions\AlbumAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\AlbumSortingCriterion; use App\DTO\SortingCriterion; @@ -10,13 +9,14 @@ use App\Models\Album; use App\Models\Extensions\AlbumBuilder; use App\Models\Extensions\SortingDecorator; +use App\Policies\AlbumQueryPolicy; use Doctrine\Instantiator\Exception\InvalidArgumentException; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; class HasManyChildAlbums extends HasManyBidirectionally { - protected AlbumAuthorisationProvider $albumAuthorisationProvider; + protected AlbumQueryPolicy $albumQueryPolicy; private AlbumSortingCriterion $sorting; public function __construct(Album $owningAlbum) @@ -25,7 +25,7 @@ public function __construct(Album $owningAlbum) // the parent constructor. // The parent constructor calls `addConstraints` and thus our own // attributes must be initialized by then - $this->albumAuthorisationProvider = resolve(AlbumAuthorisationProvider::class); + $this->albumQueryPolicy = resolve(AlbumQueryPolicy::class); $this->sorting = AlbumSortingCriterion::createDefault(); parent::__construct( $owningAlbum->newQuery(), @@ -55,7 +55,7 @@ public function addConstraints() { if (static::$constraints) { parent::addConstraints(); - $this->albumAuthorisationProvider->applyVisibilityFilter($this->getRelationQuery()); + $this->albumQueryPolicy->applyVisibilityFilter($this->getRelationQuery()); } } @@ -65,7 +65,7 @@ public function addConstraints() public function addEagerConstraints(array $models) { parent::addEagerConstraints($models); - $this->albumAuthorisationProvider->applyVisibilityFilter($this->getRelationQuery()); + $this->albumQueryPolicy->applyVisibilityFilter($this->getRelationQuery()); } /** diff --git a/app/Relations/HasManyChildPhotos.php b/app/Relations/HasManyChildPhotos.php index 1529a086fd..e612cdcd18 100644 --- a/app/Relations/HasManyChildPhotos.php +++ b/app/Relations/HasManyChildPhotos.php @@ -2,7 +2,6 @@ namespace App\Relations; -use App\Actions\PhotoAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\SortingCriterion; use App\Exceptions\Internal\InvalidOrderDirectionException; @@ -10,6 +9,7 @@ use App\Models\Extensions\FixedQueryBuilder; use App\Models\Extensions\SortingDecorator; use App\Models\Photo; +use App\Policies\PhotoQueryPolicy; use Doctrine\Instantiator\Exception\InvalidArgumentException; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\InvalidCastException; @@ -17,7 +17,7 @@ class HasManyChildPhotos extends HasManyBidirectionally { - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected PhotoQueryPolicy $photoQueryPolicy; public function __construct(Album $owningAlbum) { @@ -25,7 +25,7 @@ public function __construct(Album $owningAlbum) // the parent constructor. // The parent constructor calls `addConstraints` and thus our own // attributes must be initialized by then - $this->photoAuthorisationProvider = resolve(PhotoAuthorisationProvider::class); + $this->photoQueryPolicy = resolve(PhotoQueryPolicy::class); parent::__construct( Photo::query(), $owningAlbum, @@ -66,7 +66,7 @@ public function addConstraints() { if (static::$constraints) { parent::addConstraints(); - $this->photoAuthorisationProvider->applyVisibilityFilter($this->getRelationQuery()); + $this->photoQueryPolicy->applyVisibilityFilter($this->getRelationQuery()); } } @@ -76,7 +76,7 @@ public function addConstraints() public function addEagerConstraints(array $models) { parent::addEagerConstraints($models); - $this->photoAuthorisationProvider->applyVisibilityFilter($this->getRelationQuery()); + $this->photoQueryPolicy->applyVisibilityFilter($this->getRelationQuery()); } /** diff --git a/app/Relations/HasManyPhotos.php b/app/Relations/HasManyPhotos.php index 8770751d88..7f28f232e6 100644 --- a/app/Relations/HasManyPhotos.php +++ b/app/Relations/HasManyPhotos.php @@ -2,13 +2,13 @@ namespace App\Relations; -use App\Actions\PhotoAuthorisationProvider; use App\DTO\SortingCriterion; use App\Exceptions\Internal\InvalidOrderDirectionException; use App\Models\Extensions\BaseAlbum; use App\Models\Extensions\FixedQueryBuilder; use App\Models\Extensions\SortingDecorator; use App\Models\Photo; +use App\Policies\PhotoQueryPolicy; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Relations\Relation; @@ -19,7 +19,7 @@ */ abstract class HasManyPhotos extends Relation { - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected PhotoQueryPolicy $photoQueryPolicy; public function __construct(BaseAlbum $owningAlbum) { @@ -27,7 +27,7 @@ public function __construct(BaseAlbum $owningAlbum) // the parent constructor. // The parent constructor calls `addConstraints` and thus our own // attributes must be initialized by then - $this->photoAuthorisationProvider = resolve(PhotoAuthorisationProvider::class); + $this->photoQueryPolicy = resolve(PhotoQueryPolicy::class); // This is a hack. // The abstract class // {@link \Illuminate\Database\Eloquent\Relations\Relation} diff --git a/app/Relations/HasManyPhotosByTag.php b/app/Relations/HasManyPhotosByTag.php index 0979926096..096bdf7aab 100644 --- a/app/Relations/HasManyPhotosByTag.php +++ b/app/Relations/HasManyPhotosByTag.php @@ -57,7 +57,7 @@ public function addEagerConstraints(array $albums): void $album = $albums[0]; $tags = $album->show_tags; - $this->photoAuthorisationProvider + $this->photoQueryPolicy ->applySearchabilityFilter($this->getRelationQuery()) ->where(function (Builder $q) use ($tags) { // Filter for requested tags diff --git a/app/Relations/HasManyPhotosRecursively.php b/app/Relations/HasManyPhotosRecursively.php index 85f4f1cd9c..787bf0737a 100644 --- a/app/Relations/HasManyPhotosRecursively.php +++ b/app/Relations/HasManyPhotosRecursively.php @@ -2,18 +2,20 @@ namespace App\Relations; -use App\Actions\AlbumAuthorisationProvider; use App\Contracts\InternalLycheeException; use App\DTO\SortingCriterion; use App\Exceptions\Internal\NotImplementedException; use App\Models\Album; use App\Models\Extensions\SortingDecorator; use App\Models\Photo; +use App\Policies\AlbumPolicy; +use App\Policies\AlbumQueryPolicy; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Facades\Gate; class HasManyPhotosRecursively extends HasManyPhotos { - protected AlbumAuthorisationProvider $albumAuthorisationProvider; + protected AlbumQueryPolicy $albumQueryPolicy; public function __construct(Album $owningAlbum) { @@ -21,7 +23,7 @@ public function __construct(Album $owningAlbum) // the parent constructor. // The parent constructor calls `addConstraints` and thus our own // attributes must be initialized by then - $this->albumAuthorisationProvider = resolve(AlbumAuthorisationProvider::class); + $this->albumQueryPolicy = resolve(AlbumQueryPolicy::class); parent::__construct($owningAlbum); } @@ -72,7 +74,7 @@ public function addEagerConstraints(array $albums): void throw new NotImplementedException('eagerly fetching all photos of an album is not implemented for multiple albums'); } - $this->photoAuthorisationProvider + $this->photoQueryPolicy ->applySearchabilityFilter($this->getRelationQuery(), $albums[0]); } @@ -80,7 +82,7 @@ public function getResults(): Collection { /** @var Album|null $album */ $album = $this->parent; - if ($album === null || !$this->albumAuthorisationProvider->isAccessible($album)) { + if ($album === null || !Gate::check(AlbumPolicy::CAN_ACCESS, $album)) { return $this->related->newCollection(); } else { return parent::getResults(); @@ -109,7 +111,7 @@ public function match(array $albums, Collection $photos, $relation): array /** @var Album $album */ $album = $albums[0]; - if (!$this->albumAuthorisationProvider->isAccessible($album)) { + if (!Gate::check(AlbumPolicy::CAN_ACCESS, $album)) { $album->setRelation($relation, $this->related->newCollection()); } else { $sorting = $album->getEffectiveSorting(); diff --git a/app/SmartAlbums/BaseSmartAlbum.php b/app/SmartAlbums/BaseSmartAlbum.php index 2e067a7dc5..5eb3b713a5 100644 --- a/app/SmartAlbums/BaseSmartAlbum.php +++ b/app/SmartAlbums/BaseSmartAlbum.php @@ -2,7 +2,6 @@ namespace App\SmartAlbums; -use App\Actions\PhotoAuthorisationProvider; use App\Contracts\AbstractAlbum; use App\Contracts\InternalLycheeException; use App\DTO\PhotoSortingCriterion; @@ -16,6 +15,7 @@ use App\Models\Extensions\Thumb; use App\Models\Extensions\UTCBasedTimes; use App\Models\Photo; +use App\Policies\PhotoQueryPolicy; use App\SmartAlbums\Utils\MimicModel; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Database\Eloquent\Builder; @@ -37,7 +37,7 @@ abstract class BaseSmartAlbum implements AbstractAlbum use MimicModel; use UTCBasedTimes; - protected PhotoAuthorisationProvider $photoAuthorisationProvider; + protected PhotoQueryPolicy $photoQueryPolicy; protected string $id; protected string $title; protected bool $isPublic; @@ -54,7 +54,7 @@ abstract class BaseSmartAlbum implements AbstractAlbum protected function __construct(string $id, string $title, bool $isPublic, \Closure $smartCondition) { try { - $this->photoAuthorisationProvider = resolve(PhotoAuthorisationProvider::class); + $this->photoQueryPolicy = resolve(PhotoQueryPolicy::class); $this->id = $id; $this->title = $title; $this->isPublic = $isPublic; @@ -72,7 +72,7 @@ protected function __construct(string $id, string $title, bool $isPublic, \Closu */ public function photos(): Builder { - return $this->photoAuthorisationProvider + return $this->photoQueryPolicy ->applySearchabilityFilter( Photo::query()->with(['album', 'size_variants', 'size_variants.sym_links']) )->where($this->smartPhotoCondition); diff --git a/config/app.php b/config/app.php index 393bed9e5c..7594e8b8c3 100644 --- a/config/app.php +++ b/config/app.php @@ -188,7 +188,6 @@ App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, // App\Providers\LangServiceProvider::class, - // App\Providers\AccessControlServiceProvider::class, ], /* @@ -204,7 +203,6 @@ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, - 'AccessControl' => App\Facades\AccessControl::class, 'Arr' => Illuminate\Support\Arr::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, diff --git a/database/migrations/2022_08_06_210757_bump_version040600.php b/database/migrations/2022_08_06_210757_bump_version040600.php new file mode 100644 index 0000000000..3595023bca --- /dev/null +++ b/database/migrations/2022_08_06_210757_bump_version040600.php @@ -0,0 +1,27 @@ +update(['value' => '040600']); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Configs::where('key', 'version')->update(['value' => '040502']); + } +} diff --git a/public/Lychee-front b/public/Lychee-front index 8e7ca757c7..b582360e6e 160000 --- a/public/Lychee-front +++ b/public/Lychee-front @@ -1 +1 @@ -Subproject commit 8e7ca757c7b230234137f9be6b283f856af17b51 +Subproject commit b582360e6e0931485670ec20d2d49b99ac068eca diff --git a/public/dist/main.js b/public/dist/main.js index 0ecfc718c3..83854473c6 100644 --- a/public/dist/main.js +++ b/public/dist/main.js @@ -1007,7 +1007,7 @@ var _templateObject = _taggedTemplateLiteral(["

", " \n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t

\n\t\t\t\t\t

$", "

\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t"]), _templateObject19 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"], ["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"]), _templateObject20 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t
"], ["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t
"]), - _templateObject21 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"]), + _templateObject21 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"]), _templateObject22 = _taggedTemplateLiteral(["", "", ""], ["", "", ""]), _templateObject23 = _taggedTemplateLiteral(["", ""], ["", ""]), _templateObject24 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"], ["\n\t\t\t\t
\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"]), @@ -1058,7 +1058,7 @@ var _templateObject = _taggedTemplateLiteral(["

", " \n\t\t\t\t", "\n\t\t\t\t\n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t"], ["\n\t\t\t

\n\t\t\t\t", "\n\t\t\t\t\n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t

\n\t\t\t\t\t", "\n\t\t\t\t

\n\t\t\t
\n\t\t"]), _templateObject70 = _taggedTemplateLiteral(["url(\"", "\")"], ["url(\"", "\")"]), _templateObject71 = _taggedTemplateLiteral(["linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url(\"", "\")"], ["linear-gradient(to bottom, rgba(0, 0, 0, .4), rgba(0, 0, 0, .4)), url(\"", "\")"]), - _templateObject72 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t\t \n\t\t\t

\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t$", "\n\t\t\t
\n\t\t\t
"], ["\n\t\t\t
\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t\t \n\t\t\t

\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t$", "\n\t\t\t
\n\t\t\t
"]), + _templateObject72 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t
\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t

\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t$", "\n\t\t\t
\n\t\t\t
\n\t\t\t
"], ["\n\t\t\t
\n\t\t\t
\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t

\n\t\t\t

$", "\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t \n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t$", "\n\t\t\t
\n\t\t\t
\n\t\t\t
"]), _templateObject73 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t\t

\n\t\t\t\t\t\t", "\n\t\t\t\t\t

\n\t\t\t\t\t

\n\t\t\t\t\t\t", "\n\t\t\t\t\t

\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t$", "\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t"], ["\n\t\t\t\t
\n\t\t\t\t\t

\n\t\t\t\t\t\t", "\n\t\t\t\t\t

\n\t\t\t\t\t

\n\t\t\t\t\t\t", "\n\t\t\t\t\t

\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t$", "\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t"]), _templateObject74 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t
\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t
\n\t\t\t"]), _templateObject75 = _taggedTemplateLiteral(["\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t

\n\t\t\t\t\t\t", "\n\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t"], ["\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t

\n\t\t\t\t\t\t", "\n\t\t\t\t\t\t

\n\t\t\t\t\t\t
\n\t\t\t\t\t\t"]), @@ -1423,7 +1423,7 @@ album.isSmartID = function (id) { * @returns {boolean} */ album.isSearchID = function (id) { - return id === SearchAlbumID; + return id === SearchAlbumIDPrefix || id.startsWith(SearchAlbumIDPrefix + "/"); }; /** @@ -1453,7 +1453,7 @@ album.getID = function () { // this is a Lambda var isID = function isID(_id) { - return album.isSmartID(_id) || /*album.isSearchID(_id) || */album.isModelID(_id); + return album.isSmartID(_id) || album.isSearchID(_id) || album.isModelID(_id); }; if (_photo3.json) id = _photo3.json.album_id;else if (album.json) id = album.json.id;else if (mapview.albumID) id = mapview.albumID; @@ -1580,11 +1580,13 @@ album.deleteSubByID = function (albumID) { /** * @param {string} albumID * @param {?AlbumLoadedCB} [albumLoadedCB=null] + * @param {?string} parentID * * @returns {void} */ album.load = function (albumID) { var albumLoadedCB = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + var parentID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; /** * @param {Album} data @@ -1592,6 +1594,13 @@ album.load = function (albumID) { var processAlbum = function processAlbum(data) { album.json = data; + if (parentID !== null) { + // Used with search so that the back button sends back to the + // search results. + album.json.original_parent_id = album.json.parent_id; + album.json.parent_id = parentID; + } + if (albumLoadedCB === null) { lychee.animate(lychee.content, "contentZoomOut"); } @@ -2996,6 +3005,7 @@ build.album = function (data) { var formattedCreationTs = lychee.locale.printMonthYear(data.created_at); var formattedMinTs = lychee.locale.printMonthYear(data.min_taken_at); var formattedMaxTs = lychee.locale.printMonthYear(data.max_taken_at); + var disableDragDrop = !album.isUploadable() || disabled || album.isSmartID(data.id) || data.is_tag_album; var subtitle = formattedCreationTs; // check setting album_subtitle_type: @@ -3032,7 +3042,7 @@ build.album = function (data) { } } - var html = lychee.html(_templateObject18, disabled ? "disabled" : "", data.is_nsfw && lychee.nsfw_blur ? "blurred" : "", data.id, data.is_nsfw ? "1" : "0", tabindex.get_next_tab_index(), album.isSmartID(data.id) || data.is_tag_album ? "false" : "true", album.isSmartID(data.id) || data.is_tag_album ? "" : "ondragstart='lychee.startDrag(event)'\n\t\t\t\tondragover='lychee.overDrag(event)'\n\t\t\t\tondragleave='lychee.leaveDrag(event)'\n\t\t\t\tondragend='lychee.endDrag(event)'\n\t\t\t\tondrop='lychee.finishDrag(event)'", build.getAlbumThumb(data), build.getAlbumThumb(data), build.getAlbumThumb(data), data.title, data.title, subtitle); + var html = lychee.html(_templateObject18, disabled ? "disabled" : "", data.is_nsfw && lychee.nsfw_blur ? "blurred" : "", data.id, data.is_nsfw ? "1" : "0", tabindex.get_next_tab_index(), disableDragDrop ? "false" : "true", disableDragDrop ? "" : "ondragstart='lychee.startDrag(event)'\n\t\t\t\tondragover='lychee.overDrag(event)'\n\t\t\t\tondragleave='lychee.leaveDrag(event)'\n\t\t\t\tondragend='lychee.endDrag(event)'\n\t\t\t\tondrop='lychee.finishDrag(event)'", build.getAlbumThumb(data), build.getAlbumThumb(data), build.getAlbumThumb(data), data.title, data.title, subtitle); if (album.isUploadable() && !disabled) { var isCover = album.json && album.json.cover_id && data.thumb.id === album.json.cover_id; @@ -3130,7 +3140,7 @@ build.photo = function (data) { } } - html += lychee.html(_templateObject21, disabled ? "disabled" : "", data.album_id, data.id, tabindex.get_next_tab_index(), thumbnail, data.title, data.title); + html += lychee.html(_templateObject21, disabled ? "disabled" : "", data.album_id, data.id, tabindex.get_next_tab_index(), !album.isUploadable() || disabled ? "false" : "true", thumbnail, data.title, data.title); if (data.taken_at !== null) html += lychee.html(_templateObject22, lychee.locale["CAMERA_DATE"], build.iconic("camera-slr"), lychee.locale.printDateTime(data.taken_at));else html += lychee.html(_templateObject23, lychee.locale.printDateTime(data.created_at)); @@ -3802,7 +3812,7 @@ contextMenu.photo = function (photoID, e) { } }, { title: build.iconic("cloud-download") + lychee.locale["DOWNLOAD"], fn: function fn() { return _photo3.getArchive([photoID]); } }]; - if (album.isSmartID(album.getID()) || album.isSearchID(album.getID) || album.isTagAlbum()) { + if (album.isSmartID(album.getID()) || album.isSearchID(album.getID()) || album.isTagAlbum()) { // Cover setting not supported for smart or tag albums and search results. items.splice(2, 1); } @@ -4402,7 +4412,7 @@ header.bind = function () { header.dom(".header__search").on("keyup click", function () { if ($(this).val().length > 0) { - lychee.goto("search/" + encodeURIComponent($(this).val())); + lychee.goto(SearchAlbumIDPrefix + "/" + encodeURIComponent($(this).val())); } else if (search.json !== null) { search.reset(); } @@ -4694,11 +4704,11 @@ header.setMode = function (mode) { } if (album.isUploadable()) { - var _e24 = $("#button_trash, #button_move, #button_visibility, #button_star"); + var _e24 = $("#button_trash, #button_move, #button_visibility, #button_star, #button_rotate_cwise, #button_rotate_ccwise"); _e24.show(); tabindex.makeFocusable(_e24); } else { - var _e25 = $("#button_trash, #button_move, #button_visibility, #button_star"); + var _e25 = $("#button_trash, #button_move, #button_visibility, #button_star, #button_rotate_cwise, #button_rotate_ccwise"); _e25.hide(); tabindex.makeUnfocusable(_e25); } @@ -5973,6 +5983,21 @@ lychee.reloadIfLegacyIDs = function (albumID, photoID, autoplay) { }; /** + * This is a "God method" that is used to load pretty much anything, based + * on what's in the web browser's URL bar after the '#' character: + * + * (nothing) --> load root album, assign null to albumID and photoID + * {albumID} --> load the album; albumID equals the given ID, photoID is null + * {albumID}/{photoID} --> load album (if not already loaded) and then the + * corresponding photo, assign the respective values to albumID and photoID + * map --> load the map of all albums + * map/{albumID} --> load the map of the respective album + * search/{term} --> load or go back to "search" album for the given term, + * assign 'search/{term}' as fictitious albumID and assign null to photoID + * search/{term}/{photoID} --> load photo within fictitious search album, + * assign 'search/{term}' as fictitious albumID and assign the given ID to + * photoID + * * @param {boolean} [autoplay=true] * @returns {void} */ @@ -5981,7 +6006,10 @@ lychee.load = function () { var hash = document.location.hash.replace("#", "").split("/"); var albumID = hash[0]; - var photoID = hash[1]; + if (albumID === SearchAlbumIDPrefix && hash.length > 1) { + albumID += "/" + hash[1]; + } + var photoID = hash[album.isSearchID(albumID) ? 2 : 1]; contextMenu.close(); multiselect.close(); @@ -6010,24 +6038,6 @@ lychee.load = function () { } mapview.open(albumID); lychee.footer_hide(); - } else if (albumID === "search") { - // Search has been triggered - var search_string = decodeURIComponent(photoID); - - if (search_string.trim() === "") { - // do nothing on "only space" search strings - return; - } - // If public search is disabled -> do nothing - if (lychee.publicMode === true && !lychee.public_search) { - loadingBar.show("error", lychee.locale["ERROR_SEARCH_DEACTIVATED"]); - return; - } - - header.dom(".header__search").val(search_string); - search.find(search_string); - - lychee.footer_show(); } else { if (lychee.reloadIfLegacyIDs(albumID, photoID, autoplay)) { return; @@ -6065,7 +6075,7 @@ lychee.load = function () { // If we don't have an album or the wrong album load the album // first and let the album loader load the photo afterwards or // load the photo directly. - if (lychee.content.html() === "" || album.json === null || album.json.id !== albumID || header.dom(".header__search").length && header.dom(".header__search").val().length !== 0) { + if (lychee.content.html() === "" || album.json === null || album.json.id !== albumID) { lychee.content.hide(); album.load(albumID, loadPhoto); } else { @@ -6090,8 +6100,6 @@ lychee.load = function () { if (visible.sidebar()) _sidebar.toggle(false); mapview.open(); lychee.footer_hide(); - } else if (albumID === "search") { - // search string is empty -> do nothing } else { if (lychee.reloadIfLegacyIDs(albumID, photoID, autoplay)) { return; @@ -6110,12 +6118,46 @@ lychee.load = function () { if (visible.sidebar() && (album.isSmartID(albumID) || album.isSearchID(albumID))) _sidebar.toggle(false); $("#sensitive_warning").hide(); if (album.json && albumID === album.json.id) { - view.album.title(); + if (album.isSearchID(albumID)) { + // We are probably coming back to the search results from + // viewing an image. Because search results is not a + // regular album, it needs to be treated a little + // differently. + header.setMode("albums"); + lychee.setTitle(lychee.locale["SEARCH_RESULTS"], false); + } else { + view.album.title(); + } lychee.content.show(); tabindex.makeFocusable(lychee.content, true); // If the album was loaded in the background (when content is // hidden), scrolling may not have worked. view.album.content.restoreScroll(); + } else if (album.isSearchID(albumID)) { + // Search has been triggered + var search_string = decodeURIComponent(hash[1]).trim(); + + if (search_string === "") { + // do nothing on "only space" search strings + return; + } + // If public search is disabled -> do nothing + if (lychee.publicMode === true && !lychee.public_search) { + loadingBar.show("error", lychee.locale["ERROR_SEARCH_DEACTIVATED"]); + return; + } + + header.dom(".header__search").val(search_string); + search.find(search_string); + } else if (visible.search()) { + // Somebody clicked on an album in search results. We + // will alter the parent_id of that album once it's loaded + // so that the back button sends us back to the search + // results. + // Trash data so that it's reloaded if needed (just as we + // would for a regular parent album). + search.json = null; + album.load(albumID, null, album.getID()); } else { album.load(albumID); } @@ -6936,8 +6978,7 @@ lychee.locale = { LOGIN_PASSWORD_CONFIRM: "Confirm Password", LOGIN_CREATE: "Create Login", - PASSWORD_TITLE: "Enter your current username and password:", - USERNAME_CURRENT: "Current Username", + PASSWORD_TITLE: "Enter your current password:", PASSWORD_CURRENT: "Current Password", PASSWORD_TEXT: "Your username and password will be changed to the following:", PASSWORD_CHANGE: "Change Login", @@ -8175,7 +8216,7 @@ _photo3.load = function (photoID, albumID, autoplay) { // TODO: Why do we overwrite the true album ID of a photo, by the externally provided one? I guess we need it, because the album which the user came from might also be a smart album or a tag album. However, in this case I would prefer to leave the `album_id untouched (don't rename it to `original_album_id`) and call this one `effective_album_id` instead. _photo3.json.album_id = albumID; - if (!visible.photo()) view.photo.show(); + view.photo.show(); view.photo.init(autoplay); lychee.imageview.show(); @@ -8457,9 +8498,9 @@ _photo3.delete = function (photoIDs) { // Show album otherwise. if (visible.photo()) { if (nextPhotoID !== null && nextPhotoID !== _photo3.getID()) { - lychee.goto(album.getID() + "/" + nextPhotoID); + lychee.goto(album.getID() + "/" + nextPhotoID, false); } else if (previousPhotoID !== null && previousPhotoID !== _photo3.getID()) { - lychee.goto(album.getID() + "/" + previousPhotoID); + lychee.goto(album.getID() + "/" + previousPhotoID, false); } else { lychee.goto(album.getID()); } @@ -8642,6 +8683,10 @@ _photo3.setAlbum = function (photoIDs, albumID) { _photo3.toggleStar = function () { _photo3.json.is_starred = !_photo3.json.is_starred; view.photo.star(); + + album.getByID(_photo3.json.id).is_starred = _photo3.json.is_starred; + view.album.content.star(_photo3.json.id); + albums.refresh(); api.post("Photo::setStar", { @@ -9255,7 +9300,7 @@ photoeditor.rotate = function (photoID, direction) { * * @type {string} */ -var SearchAlbumID = "search"; +var SearchAlbumIDPrefix = "search"; /** * @typedef SearchAlbum @@ -9264,7 +9309,7 @@ var SearchAlbumID = "search"; * mostly compatible with the other album types, i.e. * {@link Album}, {@link TagAlbum} and {@link SmartAlbum}. * - * @property {string} id - always equals `SearchAlbumID` + * @property {string} id - always equals `SearchAlbumIDPrefix/search-term` * @property {string} title - always equals `lychee.locale["SEARCH_RESULTS"]` * @property {Photo[]} photos - the found photos * @property {Album[]} albums - the found albums @@ -9292,8 +9337,10 @@ search.find = function (term) { /** @param {SearchResult} data */ var successHandler = function successHandler(data) { - // Do nothing, if search result is identical to previous result if (search.json && search.json.checksum === data.checksum) { + // If search result is identical to previous result, just + // update the album id with the new search term and bail out. + album.json.id = SearchAlbumIDPrefix + "/" + term; return; } @@ -9301,7 +9348,7 @@ search.find = function (term) { // Create and assign a `SearchAlbum` album.json = { - id: SearchAlbumID, + id: SearchAlbumIDPrefix + "/" + term, title: lychee.locale["SEARCH_RESULTS"], photos: search.json.photos, albums: search.json.albums, @@ -9583,14 +9630,6 @@ settings.bind = function (inputSelector, formSelector, settingClickCB) { * @returns {void} */ settings.changeLogin = function (params) { - if (params.username.length < 1) { - loadingBar.show("error", lychee.locale["ERROR_EMPTY_USERNAME"]); - $("input[name=username]").addClass("error"); - return; - } else { - $("input[name=username]").removeClass("error"); - } - if (params.password.length < 1) { loadingBar.show("error", lychee.locale["ERROR_EMPTY_PASSWORD"]); $("input[name=password]").addClass("error"); @@ -9607,7 +9646,7 @@ settings.changeLogin = function (params) { $("input[name=confirm]").removeClass("error"); } - api.post("Settings::setLogin", params, function () { + api.post("Settings::updateLogin", params, function () { $("input[name]").removeClass("error"); loadingBar.show("success", lychee.locale["SETTINGS_SUCCESS_LOGIN"]); view.settings.content.clearLogin(); @@ -10050,7 +10089,7 @@ _sidebar.triggerSearch = function (search_string) { search.json = null; // We're either logged in or public search is allowed - lychee.goto("search/" + encodeURIComponent(search_string)); + lychee.goto(SearchAlbumIDPrefix + "/" + encodeURIComponent(search_string)); }; /** @@ -10074,7 +10113,7 @@ _sidebar.toggle = function (is_user_initiated) { lychee.imageview.toggleClass("image--sidebar"); if (typeof view !== "undefined") view.album.content.justify(album.json ? album.json.photos : []); _sidebar.dom().toggleClass("active"); - _photo3.updateSizeLivePhotoDuringAnimation(); + if (_photo3.updateSizeLivePhotoDuringAnimation) _photo3.updateSizeLivePhotoDuringAnimation(); if (is_user_initiated) sessionStorage.setItem("keepSidebarVisible", visible.sidebar() ? "true" : "false"); } @@ -12583,31 +12622,33 @@ view.photo = { lychee.content.addClass("view"); header.setMode("photo"); - // Make body not scrollable - // use bodyScrollLock package to enable locking on iOS - // Simple overflow: hidden not working on iOS Safari - // Only the info pane needs scrolling - // Touch event for swiping of photo still work - - scrollLock.disablePageScroll($(".sidebar__wrapper").get()); + if (!visible.photo()) { + // Make body not scrollable + // use bodyScrollLock package to enable locking on iOS + // Simple overflow: hidden not working on iOS Safari + // Only the info pane needs scrolling + // Touch event for swiping of photo still work + + scrollLock.disablePageScroll($(".sidebar__wrapper").get()); + + // Fullscreen + var timeout = null; + $(document).bind("mousemove", function () { + clearTimeout(timeout); + // For live Photos: header animation only if LivePhoto is not playing + if (!_photo3.isLivePhotoPlaying() && lychee.header_auto_hide) { + header.show(); + timeout = setTimeout(header.hideIfLivePhotoNotPlaying, 2500); + } + }); - // Fullscreen - var timeout = null; - $(document).bind("mousemove", function () { - clearTimeout(timeout); - // For live Photos: header animation only if LivePhoto is not playing - if (!_photo3.isLivePhotoPlaying() && lychee.header_auto_hide) { - header.show(); - timeout = setTimeout(header.hideIfLivePhotoNotPlaying, 2500); + // we also put this timeout to enable it by default when you directly click on a picture. + if (lychee.header_auto_hide) { + setTimeout(header.hideIfLivePhotoNotPlaying, 2500); } - }); - // we also put this timeout to enable it by default when you directly click on a picture. - if (lychee.header_auto_hide) { - setTimeout(header.hideIfLivePhotoNotPlaying, 2500); + lychee.animate(lychee.imageview, "fadeIn"); } - - lychee.animate(lychee.imageview, "fadeIn"); }, /** @@ -12843,8 +12884,6 @@ view.photo = { /* Note: the condition below is duplicated in contextMenu.photoMore() */ if (_photo3.json.type && (_photo3.json.type.indexOf("video") === 0 || _photo3.json.type === "raw") || _photo3.json.live_photo_url !== "" && _photo3.json.live_photo_url !== null) { $("#button_rotate_cwise, #button_rotate_ccwise").hide(); - } else { - $("#button_rotate_cwise, #button_rotate_ccwise").show(); } }, @@ -12927,7 +12966,7 @@ view.settings = { * @returns {void} */ setLogin: function setLogin() { - var msg = lychee.html(_templateObject72, lychee.locale["PASSWORD_TITLE"], lychee.locale["USERNAME_CURRENT"], lychee.locale["PASSWORD_CURRENT"], lychee.locale["PASSWORD_TEXT"], lychee.locale["LOGIN_USERNAME"], lychee.locale["LOGIN_PASSWORD"], lychee.locale["LOGIN_PASSWORD_CONFIRM"], lychee.locale["PASSWORD_CHANGE"]); + var msg = lychee.html(_templateObject72, lychee.locale["PASSWORD_TITLE"], lychee.locale["PASSWORD_CURRENT"], lychee.locale["PASSWORD_TEXT"], lychee.locale["LOGIN_USERNAME"], lychee.locale["LOGIN_PASSWORD"], lychee.locale["LOGIN_PASSWORD_CONFIRM"], lychee.locale["PASSWORD_CHANGE"]); $(".settings_view").append(msg); @@ -13675,7 +13714,7 @@ visible.config = function () { /** @returns {boolean} */ visible.search = function () { - return search.json !== null; + return visible.albums() && album.json !== null && album.isSearchID(album.json.id); }; /** @returns {boolean} */ diff --git a/public/dist/page.css b/public/dist/page.css index 191b9d12b6..2ddf8f4ebb 100644 --- a/public/dist/page.css +++ b/public/dist/page.css @@ -3935,7 +3935,6 @@ div.right_70 { float: none !important; margin: 0 0 30px 0; } - div.left_50 img { width: 100% !important; } diff --git a/public/dist/view.js b/public/dist/view.js index ac4cf6a4cb..e5f5df5d2f 100644 --- a/public/dist/view.js +++ b/public/dist/view.js @@ -4,6 +4,10 @@ /*! lazysizes - v5.3.2 */ !function(e){var t=function(u,D,f){"use strict";var k,H;if(function(){var e;var t={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",fastLoadedClass:"ls-is-cached",iframeLoadMode:0,srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:true,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:true,ricTimeout:0,throttleDelay:125};H=u.lazySizesConfig||u.lazysizesConfig||{};for(e in t){if(!(e in H)){H[e]=t[e]}}}(),!D||!D.getElementsByClassName){return{init:function(){},cfg:H,noSupport:true}}var O=D.documentElement,i=u.HTMLPictureElement,P="addEventListener",$="getAttribute",q=u[P].bind(u),I=u.setTimeout,U=u.requestAnimationFrame||I,o=u.requestIdleCallback,j=/^picture$/i,r=["load","error","lazyincluded","_lazyloaded"],a={},G=Array.prototype.forEach,J=function(e,t){if(!a[t]){a[t]=new RegExp("(\\s|^)"+t+"(\\s|$)")}return a[t].test(e[$]("class")||"")&&a[t]},K=function(e,t){if(!J(e,t)){e.setAttribute("class",(e[$]("class")||"").trim()+" "+t)}},Q=function(e,t){var a;if(a=J(e,t)){e.setAttribute("class",(e[$]("class")||"").replace(a," "))}},V=function(t,a,e){var i=e?P:"removeEventListener";if(e){V(t,a)}r.forEach(function(e){t[i](e,a)})},X=function(e,t,a,i,r){var n=D.createEvent("Event");if(!a){a={}}a.instance=k;n.initEvent(t,!i,!r);n.detail=a;e.dispatchEvent(n);return n},Y=function(e,t){var a;if(!i&&(a=u.picturefill||H.pf)){if(t&&t.src&&!e[$]("srcset")){e.setAttribute("srcset",t.src)}a({reevaluate:true,elements:[e]})}else if(t&&t.src){e.src=t.src}},Z=function(e,t){return(getComputedStyle(e,null)||{})[t]},s=function(e,t,a){a=a||e.offsetWidth;while(a49?function(){o(t,{timeout:n});if(n!==H.ricTimeout){n=H.ricTimeout}}:te(function(){I(t)},true);return function(e){var t;if(e=e===true){n=33}if(a){return}a=true;t=r-(f.now()-i);if(t<0){t=0}if(e||t<9){s()}else{I(s,t)}}},ie=function(e){var t,a;var i=99;var r=function(){t=null;e()};var n=function(){var e=f.now()-a;if(e0;if(r&&Z(i,"overflow")!="visible"){a=i.getBoundingClientRect();r=C>a.left&&pa.top-1&&g500&&O.clientWidth>500?500:370:H.expand;k._defEx=u;f=u*H.expFactor;c=H.hFac;A=null;if(w2&&h>2&&!D.hidden){w=f;N=0}else if(h>1&&N>1&&M<6){w=u}else{w=_}}if(l!==n){y=innerWidth+n*c;z=innerHeight+n;s=n*-1;l=n}a=d[t].getBoundingClientRect();if((b=a.bottom)>=s&&(g=a.top)<=z&&(C=a.right)>=s*c&&(p=a.left)<=y&&(b||C||p||g)&&(H.loadHidden||x(d[t]))&&(m&&M<3&&!o&&(h<3||N<4)||W(d[t],n))){R(d[t]);r=true;if(M>9){break}}else if(!r&&m&&!i&&M<4&&N<4&&h>2&&(v[0]||H.preloadAfterLoad)&&(v[0]||!o&&(b||C||p||g||d[t][$](H.sizesAttr)!="auto"))){i=v[0]||d[t]}}if(i&&!r){R(i)}}};var a=ae(t);var S=function(e){var t=e.target;if(t._lazyCache){delete t._lazyCache;return}L(e);K(t,H.loadedClass);Q(t,H.loadingClass);V(t,B);X(t,"lazyloaded")};var i=te(S);var B=function(e){i({target:e.target})};var T=function(e,t){var a=e.getAttribute("data-load-mode")||H.iframeLoadMode;if(a==0){e.contentWindow.location.replace(t)}else if(a==1){e.src=t}};var F=function(e){var t;var a=e[$](H.srcsetAttr);if(t=H.customMedia[e[$]("data-media")||e[$]("media")]){e.setAttribute("media",t)}if(a){e.setAttribute("srcset",a)}};var s=te(function(t,e,a,i,r){var n,s,o,l,u,f;if(!(u=X(t,"lazybeforeunveil",e)).defaultPrevented){if(i){if(a){K(t,H.autosizesClass)}else{t.setAttribute("sizes",i)}}s=t[$](H.srcsetAttr);n=t[$](H.srcAttr);if(r){o=t.parentNode;l=o&&j.test(o.nodeName||"")}f=e.firesLoad||"src"in t&&(s||n||l);u={target:t};K(t,H.loadingClass);if(f){clearTimeout(c);c=I(L,2500);V(t,B,true)}if(l){G.call(o.getElementsByTagName("source"),F)}if(s){t.setAttribute("srcset",s)}else if(n&&!l){if(d.test(t.nodeName)){T(t,n)}else{t.src=n}}if(r&&(s||l)){Y(t,{src:n})}}if(t._lazyRace){delete t._lazyRace}Q(t,H.lazyClass);ee(function(){var e=t.complete&&t.naturalWidth>1;if(!f||e){if(e){K(t,H.fastLoadedClass)}S(u);t._lazyCache=true;I(function(){if("_lazyCache"in t){delete t._lazyCache}},9)}if(t.loading=="lazy"){M--}},true)});var R=function(e){if(e._lazyRace){return}var t;var a=n.test(e.nodeName);var i=a&&(e[$](H.sizesAttr)||e[$]("sizes"));var r=i=="auto";if((r||!m)&&a&&(e[$]("src")||e.srcset)&&!e.complete&&!J(e,H.errorClass)&&J(e,H.lazyClass)){return}t=X(e,"lazyunveilread").detail;if(r){re.updateElem(e,true,e.offsetWidth)}e._lazyRace=true;M++;s(e,t,r,i,a)};var r=ie(function(){H.loadMode=3;a()});var o=function(){if(H.loadMode==3){H.loadMode=2}r()};var l=function(){if(m){return}if(f.now()-e<999){I(l,999);return}m=true;H.loadMode=3;a();q("scroll",o,true)};return{_:function(){e=f.now();k.elements=D.getElementsByClassName(H.lazyClass);v=D.getElementsByClassName(H.lazyClass+" "+H.preloadClass);q("scroll",a,true);q("resize",a,true);q("pageshow",function(e){if(e.persisted){var t=D.querySelectorAll("."+H.loadingClass);if(t.length&&t.forEach){U(function(){t.forEach(function(e){if(e.complete){R(e)}})})}}});if(u.MutationObserver){new MutationObserver(a).observe(O,{childList:true,subtree:true,attributes:true})}else{O[P]("DOMNodeInserted",a,true);O[P]("DOMAttrModified",a,true);setInterval(a,999)}q("hashchange",a,true);["focus","mouseover","click","load","transitionend","animationend"].forEach(function(e){D[P](e,a,true)});if(/d$|^c/.test(D.readyState)){l()}else{q("load",l);D[P]("DOMContentLoaded",a);I(l,2e4)}if(k.elements.length){t();ee._lsFlush()}else{a()}},checkElems:a,unveil:R,_aLSL:o}}(),re=function(){var a;var n=te(function(e,t,a,i){var r,n,s;e._lazysizesWidth=i;i+="px";e.setAttribute("sizes",i);if(j.test(t.nodeName||"")){r=t.getElementsByTagName("source");for(n=0,s=r.length;n | BSD-3-Clause */ +!function(){"use strict";var g={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function y(e){return function(e,t){var r,n,i,s,a,o,p,c,l,u=1,f=e.length,d="";for(n=0;n>>0).toString(8);break;case"s":r=String(r),r=s.precision?r.substring(0,s.precision):r;break;case"t":r=String(!!r),r=s.precision?r.substring(0,s.precision):r;break;case"T":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=s.precision?r.substring(0,s.precision):r;break;case"u":r=parseInt(r,10)>>>0;break;case"v":r=r.valueOf(),r=s.precision?r.substring(0,s.precision):r;break;case"x":r=(parseInt(r,10)>>>0).toString(16);break;case"X":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}g.json.test(s.type)?d+=r:(!g.number.test(s.type)||c&&!s.sign?l="":(l=c?"+":"-",r=r.toString().replace(g.sign,"")),o=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",p=s.width-(l+r).length,a=s.width&&0\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t ", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t"]), _templateObject6 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"], ["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"]), _templateObject7 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t
"], ["\n\t\t\t\t
\n\t\t\t\t\t", "\n\t\t\t\t
"]), - _templateObject8 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"]), + _templateObject8 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"], ["\n\t\t\t
\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t\t

$", "

\n\t\t\t"]), _templateObject9 = _taggedTemplateLiteral(["", "", ""], ["", "", ""]), _templateObject10 = _taggedTemplateLiteral(["", ""], ["", ""]), _templateObject11 = _taggedTemplateLiteral(["\n\t\t\t\t
\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"], ["\n\t\t\t\t
\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t", "\n\t\t\t\t
\n\t\t\t\t"]), @@ -272,6 +276,7 @@ var lychee = {}; lychee.content = $(".content"); lychee.imageview = $("#imageview"); lychee.mapview = $("#mapview"); +lychee.locale = {}; /** * DON'T USE THIS METHOD. @@ -551,6 +556,10 @@ var loadPhotoInfo = function loadPhotoInfo(photoID) { document.title = "Lychee – " + _title; header.dom(".header__title").text(_title); + if (photo.json.hasOwnProperty("is_share_button_visible") && !photo.json.is_share_button_visible) { + $("#button_share").hide(); + } + // Render HTML imageview.html(build.imageview(data, true, false).html); imageview.find(".arrow_wrapper").remove(); @@ -673,6 +682,7 @@ build.album = function (data) { var formattedCreationTs = lychee.locale.printMonthYear(data.created_at); var formattedMinTs = lychee.locale.printMonthYear(data.min_taken_at); var formattedMaxTs = lychee.locale.printMonthYear(data.max_taken_at); + var disableDragDrop = !album.isUploadable() || disabled || album.isSmartID(data.id) || data.is_tag_album; var subtitle = formattedCreationTs; // check setting album_subtitle_type: @@ -709,7 +719,7 @@ build.album = function (data) { } } - var html = lychee.html(_templateObject5, disabled ? "disabled" : "", data.is_nsfw && lychee.nsfw_blur ? "blurred" : "", data.id, data.is_nsfw ? "1" : "0", tabindex.get_next_tab_index(), album.isSmartID(data.id) || data.is_tag_album ? "false" : "true", album.isSmartID(data.id) || data.is_tag_album ? "" : "ondragstart='lychee.startDrag(event)'\n\t\t\t\tondragover='lychee.overDrag(event)'\n\t\t\t\tondragleave='lychee.leaveDrag(event)'\n\t\t\t\tondragend='lychee.endDrag(event)'\n\t\t\t\tondrop='lychee.finishDrag(event)'", build.getAlbumThumb(data), build.getAlbumThumb(data), build.getAlbumThumb(data), data.title, data.title, subtitle); + var html = lychee.html(_templateObject5, disabled ? "disabled" : "", data.is_nsfw && lychee.nsfw_blur ? "blurred" : "", data.id, data.is_nsfw ? "1" : "0", tabindex.get_next_tab_index(), disableDragDrop ? "false" : "true", disableDragDrop ? "" : "ondragstart='lychee.startDrag(event)'\n\t\t\t\tondragover='lychee.overDrag(event)'\n\t\t\t\tondragleave='lychee.leaveDrag(event)'\n\t\t\t\tondragend='lychee.endDrag(event)'\n\t\t\t\tondrop='lychee.finishDrag(event)'", build.getAlbumThumb(data), build.getAlbumThumb(data), build.getAlbumThumb(data), data.title, data.title, subtitle); if (album.isUploadable() && !disabled) { var isCover = album.json && album.json.cover_id && data.thumb.id === album.json.cover_id; @@ -807,7 +817,7 @@ build.photo = function (data) { } } - html += lychee.html(_templateObject8, disabled ? "disabled" : "", data.album_id, data.id, tabindex.get_next_tab_index(), thumbnail, data.title, data.title); + html += lychee.html(_templateObject8, disabled ? "disabled" : "", data.album_id, data.id, tabindex.get_next_tab_index(), !album.isUploadable() || disabled ? "false" : "true", thumbnail, data.title, data.title); if (data.taken_at !== null) html += lychee.html(_templateObject9, lychee.locale["CAMERA_DATE"], build.iconic("camera-slr"), lychee.locale.printDateTime(data.taken_at));else html += lychee.html(_templateObject10, lychee.locale.printDateTime(data.created_at)); @@ -1207,7 +1217,7 @@ header.bind = function () { header.dom(".header__search").on("keyup click", function () { if ($(this).val().length > 0) { - lychee.goto("search/" + encodeURIComponent($(this).val())); + lychee.goto(SearchAlbumIDPrefix + "/" + encodeURIComponent($(this).val())); } else if (search.json !== null) { search.reset(); } @@ -1499,11 +1509,11 @@ header.setMode = function (mode) { } if (album.isUploadable()) { - var _e23 = $("#button_trash, #button_move, #button_visibility, #button_star"); + var _e23 = $("#button_trash, #button_move, #button_visibility, #button_star, #button_rotate_cwise, #button_rotate_ccwise"); _e23.show(); tabindex.makeFocusable(_e23); } else { - var _e24 = $("#button_trash, #button_move, #button_visibility, #button_star"); + var _e24 = $("#button_trash, #button_move, #button_visibility, #button_star, #button_rotate_cwise, #button_rotate_ccwise"); _e24.hide(); tabindex.makeUnfocusable(_e24); } @@ -1623,7 +1633,7 @@ visible.config = function () { /** @returns {boolean} */ visible.search = function () { - return search.json !== null; + return visible.albums() && album.json !== null && album.isSearchID(album.json.id); }; /** @returns {boolean} */ @@ -1743,7 +1753,7 @@ sidebar.triggerSearch = function (search_string) { search.json = null; // We're either logged in or public search is allowed - lychee.goto("search/" + encodeURIComponent(search_string)); + lychee.goto(SearchAlbumIDPrefix + "/" + encodeURIComponent(search_string)); }; /** @@ -1767,7 +1777,7 @@ sidebar.toggle = function (is_user_initiated) { lychee.imageview.toggleClass("image--sidebar"); if (typeof view !== "undefined") view.album.content.justify(album.json ? album.json.photos : []); sidebar.dom().toggleClass("active"); - photo.updateSizeLivePhotoDuringAnimation(); + if (photo.updateSizeLivePhotoDuringAnimation) photo.updateSizeLivePhotoDuringAnimation(); if (is_user_initiated) sessionStorage.setItem("keepSidebarVisible", visible.sidebar() ? "true" : "false"); } @@ -2975,8 +2985,7 @@ lychee.locale = { LOGIN_PASSWORD_CONFIRM: "Confirm Password", LOGIN_CREATE: "Create Login", - PASSWORD_TITLE: "Enter your current username and password:", - USERNAME_CURRENT: "Current Username", + PASSWORD_TITLE: "Enter your current password:", PASSWORD_CURRENT: "Current Password", PASSWORD_TEXT: "Your username and password will be changed to the following:", PASSWORD_CHANGE: "Change Login", diff --git a/resources/views/components/photo.blade.php b/resources/views/components/photo.blade.php index 8c19e114c3..b023ccf4b0 100644 --- a/resources/views/components/photo.blade.php +++ b/resources/views/components/photo.blade.php @@ -1,12 +1,12 @@ -
- @if ($show_live) + @if ($show_live) @include('components.photo.thumb-live') @elseif ($show_play) @@ -14,7 +14,7 @@ class='photo' {{-- ${disabled ? `disabled` : ``}'--}} @elseif ($show_placeholder) @include('components.photo.thumb-placeholder') - + @else

{{ $title }}

- @if ($takedate !== "") + @if ($takedate !== "") {{ $takedate }} @else {{ $sysdate }} @endif
- @if (AccessControl::is_logged_in()) + @if (Auth::check())
@if($star) diff --git a/resources/views/livewire/header.blade.php b/resources/views/livewire/header.blade.php index ce1868ff7d..44aba726fb 100644 --- a/resources/views/livewire/header.blade.php +++ b/resources/views/livewire/header.blade.php @@ -1,7 +1,7 @@
@if($mode == 'albums')
- @if(!AccessControl::is_logged_in()) + @if(!Auth::check()) @@ -20,7 +20,7 @@ - @if(AccessControl::is_logged_in()) + @if(Auth::check()) @@ -36,7 +36,7 @@ {{ $title }} - @if(AccessControl::is_logged_in()) + @if(Auth::check()) @@ -59,7 +59,7 @@ - @if(AccessControl::is_logged_in()) + @if(Auth::check()) @@ -74,7 +74,7 @@ - @if(AccessControl::is_logged_in()) + @if(Auth::check()) @@ -90,7 +90,7 @@ {{ $title }} - @if(AccessControl::is_logged_in()) + @if(Auth::check()) @@ -113,7 +113,7 @@ - @if(AccessControl::is_logged_in()) + @if(Auth::check()) @@ -144,7 +144,7 @@
- @else + @else -@if (AccessControl::is_logged_in()) +@if (Auth::check())
@if (isset($data['nsfw']) && $data['nsfw'] == "1") diff --git a/routes/api.php b/routes/api.php index 3f8943ad4a..b97cc5698d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -87,6 +87,7 @@ Route::post('/Session::logout', [SessionController::class, 'logout']); Route::post('/Settings::setLogin', [Administration\SettingsController::class, 'setLogin']); +Route::post('/Settings::updateLogin', [Administration\SettingsController::class, 'updateLogin']); Route::post('/Sharing::list', [Administration\SharingController::class, 'list']); Route::post('/Sharing::add', [Administration\SharingController::class, 'add']); @@ -96,5 +97,5 @@ Route::post('/WebAuthn::register', [Administration\WebAuthController::class, 'verifyRegistration']); Route::post('/WebAuthn::login/gen', [Administration\WebAuthController::class, 'generateAuthentication']); Route::post('/WebAuthn::login', [Administration\WebAuthController::class, 'verifyAuthentication']); -Route::post('/WebAuthn::list', [Administration\WebAuthController::class, 'list']); -Route::post('/WebAuthn::delete', [Administration\WebAuthController::class, 'delete']); +Route::post('/WebAuthn::list', [Administration\WebAuthController::class, 'list'])->middleware(['admin']); +Route::post('/WebAuthn::delete', [Administration\WebAuthController::class, 'delete'])->middleware(['admin']); diff --git a/routes/web.php b/routes/web.php index 684a03167c..30832ff0ed 100644 --- a/routes/web.php +++ b/routes/web.php @@ -28,8 +28,8 @@ Route::get('/', [IndexController::class, 'show'])->name('home')->middleware(['installation:complete', 'migration:complete']); Route::get('/gallery', [IndexController::class, 'gallery'])->name('gallery')->middleware(['installation:complete', 'migration:complete']); Route::match(['get', 'post'], '/migrate', [Administration\UpdateController::class, 'migrate']) - ->name('migrate') - ->middleware(['installation:complete', 'migration:incomplete']); + ->name('migrate') + ->middleware(['installation:complete', 'migration:incomplete']); /* * TODO see to add better redirection functionality later. diff --git a/tests/Feature/AlbumTest.php b/tests/Feature/AlbumTest.php index d0d5eadcbc..832a357656 100644 --- a/tests/Feature/AlbumTest.php +++ b/tests/Feature/AlbumTest.php @@ -12,13 +12,14 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; use App\SmartAlbums\PublicAlbum; use App\SmartAlbums\RecentAlbum; use App\SmartAlbums\StarredAlbum; use App\SmartAlbums\UnsortedAlbum; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Session; use Tests\Feature\Lib\AlbumsUnitTest; use Tests\Feature\Lib\RootAlbumUnitTest; use Tests\Feature\Lib\SharingUnitTest; @@ -79,7 +80,7 @@ public function testAddNotLogged(): void public function testAddReadLogged(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $this->clearCachedSmartAlbums(); $this->albums_tests->get(RecentAlbum::ID); @@ -142,7 +143,8 @@ public function testAddReadLogged(): void /* * Flush the session to see if we can access the album */ - AccessControl::logout(); + Auth::logout(); + Session::flush(); /* * Let's try to get the info of the album we just created. @@ -151,7 +153,7 @@ public function testAddReadLogged(): void $this->albums_tests->unlock($albumID1, 'wrong-password', 403); $this->albums_tests->get($albumID1, 401); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); /* * Let's try to delete this album. @@ -167,7 +169,8 @@ public function testAddReadLogged(): void $this->root_album_tests->get(200, null, $albumID3); $this->root_album_tests->get(200, null, $albumTagID1); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } /** @@ -214,7 +217,7 @@ public function testMultiDelete(): void // tests. static::assertDatabaseCount('base_albums', 0); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); // Create the test layout $albumID1 = $this->albums_tests->add(null, 'Album 1')->offsetGet('id'); @@ -306,20 +309,22 @@ public function testMultiDelete(): void ], ], $albumStat); } finally { - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } public function testTrueNegative(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $this->albums_tests->set_description('-1', 'new description', 422); $this->albums_tests->set_description('abcdefghijklmnopqrstuvwx', 'new description', 404); $this->albums_tests->set_protection_policy('-1', true, true, false, false, true, true, null, 422); $this->albums_tests->set_protection_policy('abcdefghijklmnopqrstuvwx', true, true, false, false, true, true, null, 404); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } public function testAlbumTree(): void @@ -328,7 +333,7 @@ public function testAlbumTree(): void $albumSortingOrder = Configs::getValueAsString(self::CONFIG_ALBUMS_SORTING_ORDER); try { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); Configs::set(self::CONFIG_ALBUMS_SORTING_COL, 'title'); Configs::set(self::CONFIG_ALBUMS_SORTING_ORDER, 'ASC'); @@ -374,94 +379,105 @@ public function testAlbumTree(): void } finally { Configs::set(self::CONFIG_ALBUMS_SORTING_COL, $albumSortingColumn); Configs::set(self::CONFIG_ALBUMS_SORTING_ORDER, $albumSortingOrder); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } public function testAddAlbumByNonAdminUserWithoutUploadPrivilege(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID = $this->users_tests->add('Test user', 'Test password', false)->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID); $this->albums_tests->add(null, 'Test Album', 403); } public function testAddAlbumByNonAdminUserWithUploadPrivilege(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID = $this->users_tests->add('Test user', 'Test password')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID); $this->albums_tests->add(null, 'Test Album'); } public function testEditAlbumByNonOwner(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID1 = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); $userID2 = $this->users_tests->add('Test user 2', 'Test password 2')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID1); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID1); $albumID = $this->albums_tests->add(null, 'Test Album')->offsetGet('id'); $this->sharing_tests->add([$albumID], [$userID2]); - AccessControl::logout(); - AccessControl::log_as_id($userID2); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID2); $this->albums_tests->set_title($albumID, 'New title for test album', 403); } public function testEditAlbumByOwner(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID = $this->users_tests->add('Test user', 'Test password 1')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID); $albumID = $this->albums_tests->add(null, 'Test Album')->offsetGet('id'); $this->albums_tests->set_title($albumID, 'New title for test album'); } public function testDeleteMultipleAlbumsByAnonUser(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $albumID1 = $this->albums_tests->add(null, 'Test Album 1')->offsetGet('id'); $albumID2 = $this->albums_tests->add(null, 'Test Album 2')->offsetGet('id'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->albums_tests->delete([$albumID1, $albumID2], 401); } public function testDeleteMultipleAlbumsByNonAdminUserWithoutUploadPrivilege(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $albumID1 = $this->albums_tests->add(null, 'Test Album 1')->offsetGet('id'); $albumID2 = $this->albums_tests->add(null, 'Test Album 2')->offsetGet('id'); $userID = $this->users_tests->add('Test user', 'Test password', false)->offsetGet('id'); $this->sharing_tests->add([$albumID1, $albumID2], [$userID]); - AccessControl::logout(); - AccessControl::log_as_id($userID); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID); $this->albums_tests->delete([$albumID1, $albumID2], 403); } public function testDeleteMultipleAlbumsByNonOwner(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID1 = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); $userID2 = $this->users_tests->add('Test user 2', 'Test password 2')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID1); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID1); $albumID1 = $this->albums_tests->add(null, 'Test Album 1')->offsetGet('id'); $albumID2 = $this->albums_tests->add(null, 'Test Album 2')->offsetGet('id'); $this->sharing_tests->add([$albumID1, $albumID2], [$userID2]); - AccessControl::logout(); - AccessControl::log_as_id($userID2); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID2); $this->albums_tests->delete([$albumID1, $albumID2], 403); } public function testDeleteMultipleAlbumsByOwner(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID); $albumID1 = $this->albums_tests->add(null, 'Test Album 1')->offsetGet('id'); $albumID2 = $this->albums_tests->add(null, 'Test Album 2')->offsetGet('id'); $this->albums_tests->delete([$albumID1, $albumID2]); diff --git a/tests/Feature/Base/PhotoTestBase.php b/tests/Feature/Base/PhotoTestBase.php index ff1e0ae3cf..55ae02da9d 100644 --- a/tests/Feature/Base/PhotoTestBase.php +++ b/tests/Feature/Base/PhotoTestBase.php @@ -12,7 +12,8 @@ namespace Tests\Feature\Base; -use App\Facades\AccessControl; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\Feature\Lib\AlbumsUnitTest; use Tests\Feature\Lib\PhotosUnitTest; use Tests\Feature\Traits\RequiresEmptyPhotos; @@ -37,12 +38,13 @@ public function setUp(): void $this->setUpRequiresExifTool(); $this->setUpRequiresFFMpeg(); $this->setUpRequiresEmptyPhotos(); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); } public function tearDown(): void { - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->tearDownRequiresEmptyPhotos(); $this->tearDownRequiresFFMpeg(); $this->tearDownRequiresExifTool(); diff --git a/tests/Feature/DiagnosticsTest.php b/tests/Feature/DiagnosticsTest.php index 9f85935308..beab43fd34 100644 --- a/tests/Feature/DiagnosticsTest.php +++ b/tests/Feature/DiagnosticsTest.php @@ -12,8 +12,9 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\TestCase; class DiagnosticsTest extends TestCase @@ -28,7 +29,7 @@ public function testDiagnostics(): void $response = $this->get('/Diagnostics'); $response->assertOk(); // code 200 something - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->get('/Diagnostics'); $response->assertOk(); // code 200 something @@ -43,6 +44,7 @@ public function testDiagnostics(): void Configs::query()->where('key', '=', 'lossless_optimization')->update(['value' => '1']); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } diff --git a/tests/Feature/GeoDataTest.php b/tests/Feature/GeoDataTest.php index f1e12ce8be..a109964120 100644 --- a/tests/Feature/GeoDataTest.php +++ b/tests/Feature/GeoDataTest.php @@ -12,11 +12,12 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; use App\SmartAlbums\RecentAlbum; use App\SmartAlbums\UnsortedAlbum; use Carbon\Carbon; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\Feature\Lib\AlbumsUnitTest; use Tests\Feature\Lib\PhotosUnitTest; use Tests\Feature\Lib\RootAlbumUnitTest; @@ -42,7 +43,7 @@ public function setUp(): void $this->albums_tests = new AlbumsUnitTest($this); $this->root_album_tests = new RootAlbumUnitTest($this); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $this->setUpRequiresEmptyPhotos(); $this->setUpRequiresEmptyAlbums(); @@ -52,7 +53,8 @@ public function tearDown(): void { $this->tearDownRequiresEmptyPhotos(); $this->tearDownRequiresEmptyAlbums(); - AccessControl::logout(); + Auth::logout(); + Session::flush(); parent::tearDown(); } @@ -188,7 +190,7 @@ public function testThumbnailsInsideHiddenAlbum(): void $includeSubAlbums = Configs::getValueAsBool(self::CONFIG_MAP_INCLUDE_SUBALBUMS); try { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); Configs::set(self::CONFIG_PUBLIC_RECENT, true); Configs::set(self::CONFIG_PUBLIC_HIDDEN, false); Configs::set(self::CONFIG_PUBLIC_SEARCH, true); @@ -225,7 +227,8 @@ public function testThumbnailsInsideHiddenAlbum(): void $this->albums_tests->set_protection_policy($albumID121); $this->albums_tests->set_protection_policy($albumID13); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); // Check that Recent and root album show nothing to ensure @@ -306,7 +309,8 @@ public function testThumbnailsInsideHiddenAlbum(): void Configs::set(self::CONFIG_MAP_DISPLAY, $displayMap); Configs::set(self::CONFIG_MAP_DISPLAY_PUBLIC, $displayMapPublicly); Configs::set(self::CONFIG_MAP_INCLUDE_SUBALBUMS, $includeSubAlbums); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } } diff --git a/tests/Feature/IndexTest.php b/tests/Feature/IndexTest.php index ed9a8281cc..74eba4e52e 100644 --- a/tests/Feature/IndexTest.php +++ b/tests/Feature/IndexTest.php @@ -12,8 +12,9 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\TestCase; class IndexTest extends TestCase @@ -42,7 +43,8 @@ public function testHome(): void */ public function testPhpInfo(): void { - AccessControl::logout(); + Auth::logout(); + Session::flush(); // we don't want a non admin to access this $response = $this->get('/phpinfo'); $response->assertForbidden(); diff --git a/tests/Feature/Lib/SessionUnitTest.php b/tests/Feature/Lib/SessionUnitTest.php index 6bf9d5887e..c96499d870 100644 --- a/tests/Feature/Lib/SessionUnitTest.php +++ b/tests/Feature/Lib/SessionUnitTest.php @@ -94,7 +94,7 @@ public function logout(): TestResponse * * @return TestResponse */ - public function set_new( + public function set_admin( string $login, string $password, int $expectedStatusCode = 204, @@ -124,18 +124,16 @@ public function set_new( * * @return TestResponse */ - public function set_old( + public function update_login( string $login, string $password, - string $oldUsername, string $oldPassword, int $expectedStatusCode = 204, ?string $assertSee = null ): TestResponse { - $response = $this->testCase->postJson('/api/Settings::setLogin', [ + $response = $this->testCase->postJson('/api/Settings::updateLogin', [ 'username' => $login, 'password' => $password, - 'oldUsername' => $oldUsername, 'oldPassword' => $oldPassword, ]); $response->assertStatus($expectedStatusCode); diff --git a/tests/Feature/LogsTest.php b/tests/Feature/LogsTest.php index 319a26a1e8..b1f5e93d96 100644 --- a/tests/Feature/LogsTest.php +++ b/tests/Feature/LogsTest.php @@ -12,8 +12,9 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Logs; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\TestCase; class LogsTest extends TestCase @@ -29,14 +30,15 @@ public function testLogs(): void $response->assertForbidden(); // set user as admin - AccessControl::log_as_id(0); + Auth::loginUsingId(0); Logs::notice(__METHOD__, __LINE__, 'test'); $response = $this->get('/Logs'); $response->assertOk(); $response->assertViewIs('logs.list'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } public function testApiLogs(): void @@ -54,7 +56,7 @@ public function testClearLogs(): void $response->assertForbidden(); // set user as admin - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/Logs::clearNoise'); $response->assertNoContent(); @@ -66,6 +68,7 @@ public function testClearLogs(): void $response->assertOk(); $response->assertSeeText('Everything looks fine, Lychee has not reported any problems!'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } diff --git a/tests/Feature/NotificationTest.php b/tests/Feature/NotificationTest.php index 9da24c4ee1..4b704662a5 100644 --- a/tests/Feature/NotificationTest.php +++ b/tests/Feature/NotificationTest.php @@ -12,9 +12,9 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Mail\PhotosAdded; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Mail; use Tests\Feature\Lib\SessionUnitTest; use Tests\Feature\Lib\UsersUnitTest; @@ -28,7 +28,7 @@ public function testNotificationSetting(): void $init_config_value = Configs::getValue('new_photos_notification'); try { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/Settings::setNewPhotosNotification', [ 'new_photos_notification' => '1', @@ -38,6 +38,8 @@ public function testNotificationSetting(): void } finally { // set to initial Configs::set('new_photos_notification', $init_config_value); + $sessions_test = new SessionUnitTest($this); + $sessions_test->logout(); } } @@ -47,7 +49,7 @@ public function testSetupUserEmail(): void $sessions_test = new SessionUnitTest($this); // add email to admin - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $users_test->update_email('test@test.com'); $sessions_test->logout(); diff --git a/tests/Feature/PhotosDownloadTest.php b/tests/Feature/PhotosDownloadTest.php index 6f3bb91c9d..6b2fe79737 100644 --- a/tests/Feature/PhotosDownloadTest.php +++ b/tests/Feature/PhotosDownloadTest.php @@ -13,12 +13,13 @@ namespace Tests\Feature; use App\Actions\Photo\Archive; -use App\Facades\AccessControl; use App\Image\ImagickHandler; use App\Image\InMemoryBuffer; use App\Image\TemporaryLocalFile; use App\Image\VideoHandler; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use function Safe\file_get_contents; use function Safe\filesize; use Symfony\Component\HttpFoundation\HeaderUtils; @@ -237,16 +238,18 @@ public function testAlbumDownloadWithMultibyteTitle(): void public function testDownloadOfInvisibleUnsortedPhotoByNonOwner(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID1 = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); $userID2 = $this->users_tests->add('Test user 2', 'Test password 2')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID1); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID1); $photoID = $this->photos_tests->upload( self::createUploadedFile(self::SAMPLE_FILE_MONGOLIA_IMAGE) )->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID2); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID2); $this->photos_tests->download([$photoID], Archive::FULL, 403); } @@ -255,19 +258,21 @@ public function testDownloadOfPhotoInSharedDownloadableAlbum(): void $areAlbumsDownloadable = Configs::getValueAsBool(self::CONFIG_DOWNLOADABLE); try { Configs::set(self::CONFIG_DOWNLOADABLE, true); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID1 = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); $userID2 = $this->users_tests->add('Test user 2', 'Test password 2')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID1); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID1); $albumID = $this->albums_tests->add(null, 'Test Album')->offsetGet('id'); $photoID = $this->photos_tests->upload( self::createUploadedFile(self::SAMPLE_FILE_MONGOLIA_IMAGE), $albumID )->offsetGet('id'); $this->sharing_tests->add([$albumID], [$userID2]); - AccessControl::logout(); - AccessControl::log_as_id($userID2); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID2); $this->photos_tests->download([$photoID]); } finally { Configs::set(self::CONFIG_DOWNLOADABLE, $areAlbumsDownloadable); @@ -279,19 +284,21 @@ public function testDownloadOfPhotoInSharedNonDownloadableAlbum(): void $areAlbumsDownloadable = Configs::getValueAsBool(self::CONFIG_DOWNLOADABLE); try { Configs::set(self::CONFIG_DOWNLOADABLE, false); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID1 = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); $userID2 = $this->users_tests->add('Test user 2', 'Test password 2')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID1); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID1); $albumID = $this->albums_tests->add(null, 'Test Album')->offsetGet('id'); $photoID = $this->photos_tests->upload( self::createUploadedFile(self::SAMPLE_FILE_MONGOLIA_IMAGE), $albumID )->offsetGet('id'); $this->sharing_tests->add([$albumID], [$userID2]); - AccessControl::logout(); - AccessControl::log_as_id($userID2); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID2); $this->photos_tests->download([$photoID], Archive::FULL, 403); } finally { Configs::set(self::CONFIG_DOWNLOADABLE, $areAlbumsDownloadable); diff --git a/tests/Feature/PhotosOperationsTest.php b/tests/Feature/PhotosOperationsTest.php index 8972f946ca..bb12b98b56 100644 --- a/tests/Feature/PhotosOperationsTest.php +++ b/tests/Feature/PhotosOperationsTest.php @@ -12,13 +12,14 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; use App\SmartAlbums\PublicAlbum; use App\SmartAlbums\RecentAlbum; use App\SmartAlbums\StarredAlbum; use App\SmartAlbums\UnsortedAlbum; use Carbon\Carbon; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\Feature\Base\PhotoTestBase; use Tests\Feature\Lib\RootAlbumUnitTest; use Tests\Feature\Lib\SharingUnitTest; @@ -328,7 +329,7 @@ public function testThumbnailsInsideHiddenAlbum(): void $photoSortingOrder = Configs::getValueAsString(self::CONFIG_PHOTOS_SORTING_ORDER); try { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); Configs::set(self::CONFIG_PUBLIC_RECENT, true); Configs::set(self::CONFIG_PUBLIC_HIDDEN, false); Configs::set(self::CONFIG_PUBLIC_SEARCH, true); @@ -365,7 +366,8 @@ public function testThumbnailsInsideHiddenAlbum(): void $this->albums_tests->set_protection_policy($albumID121); $this->albums_tests->set_protection_policy($albumID13); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); // Check that Recent and root album show nothing to ensure @@ -452,13 +454,14 @@ public function testThumbnailsInsideHiddenAlbum(): void Configs::set(self::CONFIG_PUBLIC_HIDDEN, $arePublicPhotosHidden); Configs::set(self::CONFIG_PUBLIC_SEARCH, $isPublicSearchEnabled); Configs::set(self::CONFIG_PUBLIC_RECENT, $isRecentPublic); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } public function testDeleteMultiplePhotosByAnonUser(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $albumID = $this->albums_tests->add(null, 'Test Album')->offsetGet('id'); $photoID1 = $this->photos_tests->upload( self::createUploadedFile(self::SAMPLE_FILE_MONGOLIA_IMAGE), $albumID @@ -467,17 +470,19 @@ public function testDeleteMultiplePhotosByAnonUser(): void self::createUploadedFile(self::SAMPLE_FILE_TRAIN_IMAGE), $albumID )->offsetGet('id'); $this->albums_tests->set_protection_policy($albumID); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->photos_tests->delete([$photoID1, $photoID2], 401); } public function testDeleteMultiplePhotosByNonOwner(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $userID1 = $this->users_tests->add('Test user 1', 'Test password 1')->offsetGet('id'); $userID2 = $this->users_tests->add('Test user 2', 'Test password 2')->offsetGet('id'); - AccessControl::logout(); - AccessControl::log_as_id($userID1); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID1); $albumID = $this->albums_tests->add(null, 'Test Album')->offsetGet('id'); $photoID1 = $this->photos_tests->upload( self::createUploadedFile(self::SAMPLE_FILE_MONGOLIA_IMAGE), $albumID @@ -486,8 +491,9 @@ public function testDeleteMultiplePhotosByNonOwner(): void self::createUploadedFile(self::SAMPLE_FILE_TRAIN_IMAGE), $albumID )->offsetGet('id'); $this->sharing_tests->add([$albumID], [$userID2]); - AccessControl::logout(); - AccessControl::log_as_id($userID2); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID2); $this->photos_tests->delete([$photoID1, $photoID2], 403); } } diff --git a/tests/Feature/RSSTest.php b/tests/Feature/RSSTest.php index bc17633c60..ac2fe851ce 100644 --- a/tests/Feature/RSSTest.php +++ b/tests/Feature/RSSTest.php @@ -12,8 +12,9 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\Feature\Lib\AlbumsUnitTest; use Tests\Feature\Lib\PhotosUnitTest; use Tests\Feature\Traits\RequiresEmptyPhotos; @@ -76,7 +77,7 @@ public function testRSS1(): void $response->assertOk(); // log as admin - AccessControl::log_as_id(0); + Auth::loginUsingId(0); // create an album $albumID = $this->albums_tests->add(null, 'test_album')->offsetGet('id'); @@ -109,7 +110,8 @@ public function testRSS1(): void Configs::set('rss_enable', $init_config_value); Configs::set('full_photo', $init_full_photo); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } } diff --git a/tests/Feature/SearchTest.php b/tests/Feature/SearchTest.php index 441a723cc7..3f53377452 100644 --- a/tests/Feature/SearchTest.php +++ b/tests/Feature/SearchTest.php @@ -12,8 +12,9 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Illuminate\Testing\TestResponse; use Tests\Feature\Base\PhotoTestBase; use Tests\Feature\Lib\SharingUnitTest; @@ -194,7 +195,8 @@ public function testDisabledPublicSearchWithAnonUser(): void try { Configs::set(self::CONFIG_PUBLIC_SEARCH, false); $this->albums_tests->add(null, 'Matching private album')->offsetGet('id'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->runSearch('Matching', 401); } finally { Configs::set(self::CONFIG_PUBLIC_SEARCH, $isPublicSearchEnabled); @@ -218,7 +220,8 @@ public function testSearchAlbumByTitleWithAnonUser(): void $this->albums_tests->set_protection_policy($albumID3); $this->albums_tests->set_protection_policy($albumID4); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $response = $this->runSearch('Matching'); $response->assertJson([ @@ -261,8 +264,9 @@ public function testSearchAlbumByTitleWithNonAdminUser(): void $this->albums_tests->set_protection_policy($albumID3); $this->albums_tests->set_protection_policy($albumID4); - AccessControl::logout(); - AccessControl::log_as_id($userID); + Auth::logout(); + Session::flush(); + Auth::loginUsingId($userID); $response = $this->runSearch('Matching'); $response->assertJson([ diff --git a/tests/Feature/SettingsTest.php b/tests/Feature/SettingsTest.php index 554f50b024..d9b151b143 100644 --- a/tests/Feature/SettingsTest.php +++ b/tests/Feature/SettingsTest.php @@ -13,15 +13,16 @@ namespace Tests\Feature; use App\DTO\SortingCriterion; -use App\Facades\AccessControl; use App\Http\Requests\Settings\SetSortingRequest; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\TestCase; class SettingsTest extends TestCase { public function testSetSorting(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $this->postJson('/api/Settings::setSorting', [ SetSortingRequest::ALBUM_SORTING_COLUMN_ATTRIBUTE => SortingCriterion::COLUMN_CREATED_AT, @@ -30,12 +31,13 @@ public function testSetSorting(): void SetSortingRequest::PHOTO_SORTING_ORDER_ATTRIBUTE => SortingCriterion::ASC, ])->assertStatus(204); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } public function testSetSortingWithIllegalAlbumAttribute(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/Settings::setSorting', [ @@ -48,12 +50,13 @@ public function testSetSortingWithIllegalAlbumAttribute(): void $response->assertStatus(422); $response->assertSee('sorting albums column must be null or one out of'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } public function testSetSortingWithIllegalPhotoAttribute(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/Settings::setSorting', [ @@ -66,12 +69,13 @@ public function testSetSortingWithIllegalPhotoAttribute(): void $response->assertStatus(422); $response->assertSee('sorting photos column must be null or one out of'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } public function testSetSortingWithUnknownOrder(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/Settings::setSorting', [ @@ -84,6 +88,7 @@ public function testSetSortingWithUnknownOrder(): void $response->assertStatus(422); $response->assertSee('order must be either'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); } } diff --git a/tests/Feature/SharingSpecialTest.php b/tests/Feature/SharingSpecialTest.php index f298b53f54..065668c12e 100644 --- a/tests/Feature/SharingSpecialTest.php +++ b/tests/Feature/SharingSpecialTest.php @@ -12,12 +12,13 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; use App\SmartAlbums\PublicAlbum; use App\SmartAlbums\RecentAlbum; use App\SmartAlbums\StarredAlbum; use App\SmartAlbums\UnsortedAlbum; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\Feature\Base\SharingTestBase; use Tests\TestCase; @@ -117,7 +118,8 @@ protected function prepareSixAlbumsWithDifferentProtectionSettings(): void $this->albums_tests->set_protection_policy($this->albumID5, true, true, false, false, true, true, self::ALBUM_PWD_2); $this->albums_tests->set_protection_policy($this->albumID6, true, true, true, false, true, true, self::ALBUM_PWD_2); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); } diff --git a/tests/Feature/SharingTestScenariosAbstract.php b/tests/Feature/SharingTestScenariosAbstract.php index 397f17bc79..60127853d5 100644 --- a/tests/Feature/SharingTestScenariosAbstract.php +++ b/tests/Feature/SharingTestScenariosAbstract.php @@ -17,10 +17,11 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\Configs; use App\SmartAlbums\RecentAlbum; use App\SmartAlbums\StarredAlbum; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\Feature\Base\SharingTestBase; use Tests\TestCase; @@ -111,7 +112,8 @@ public function tearDown(): void protected function prepareUnsortedPrivatePhoto(): void { $this->photoID1 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_MONGOLIA_IMAGE))->offsetGet('id'); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -155,7 +157,8 @@ protected function prepareUnsortedPublicAndPrivatePhoto(): void $this->photoID2 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_MONGOLIA_IMAGE))->offsetGet('id'); $this->photos_tests->set_public($this->photoID1, true); $this->photos_tests->set_star([$this->photoID1], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -179,7 +182,8 @@ protected function preparePublicAndPrivatePhotoInPrivateAlbum(): void $this->photoID2 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_MONGOLIA_IMAGE), $this->albumID1)->offsetGet('id'); $this->photos_tests->set_public($this->photoID1, true); $this->photos_tests->set_star([$this->photoID1], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -199,7 +203,8 @@ protected function prepareTwoPhotosInPublicAlbum(): void $this->photoID2 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_MONGOLIA_IMAGE), $this->albumID1)->offsetGet('id'); $this->albums_tests->set_protection_policy($this->albumID1); $this->photos_tests->set_star([$this->photoID1], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -286,7 +291,8 @@ protected function preparePublicUnsortedPhotoAndPhotoInSharedAlbum(): void $this->sharing_tests->add([$this->albumID1], [$this->userID]); $this->photos_tests->set_public($this->photoID1, true); $this->photos_tests->set_star([$this->photoID1, $this->photoID2], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -308,7 +314,8 @@ protected function preparePublicAlbumAndPasswordProtectedAlbum(): void $this->photoID2 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_TRAIN_IMAGE), $this->albumID2)->offsetGet('id'); $this->albums_tests->set_protection_policy($this->albumID1, true, true, false, false, true, true, self::ALBUM_PWD_1); $this->albums_tests->set_protection_policy($this->albumID2); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -442,7 +449,8 @@ protected function preparePublicAlbumAndPasswordProtectedAlbumWithStarredPhoto() $this->albums_tests->set_protection_policy($this->albumID1, true, true, false, false, true, true, self::ALBUM_PWD_1); $this->albums_tests->set_protection_policy($this->albumID2); $this->photos_tests->set_star([$this->photoID1], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -581,7 +589,8 @@ protected function preparePublicAlbumAndHiddenAlbum(): void $this->albums_tests->set_protection_policy($this->albumID1); $this->albums_tests->set_protection_policy($this->albumID2, true, true, true); $this->photos_tests->set_star([$this->photoID2], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -662,7 +671,8 @@ protected function preparePublicAlbumAndHiddenPasswordProtectedAlbum(): void $this->albums_tests->set_protection_policy($this->albumID1); $this->albums_tests->set_protection_policy($this->albumID2, true, true, true, false, true, true, self::ALBUM_PWD_2); $this->photos_tests->set_star([$this->photoID2], true); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -794,7 +804,8 @@ protected function preparePhotosInSharedAndPrivateAlbum(): void $this->photoID1 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_MONGOLIA_IMAGE), $this->albumID1)->offsetGet('id'); $this->photoID2 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_TRAIN_IMAGE), $this->albumID2)->offsetGet('id'); $this->sharing_tests->add([$this->albumID1], [$this->userID]); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -816,7 +827,8 @@ protected function preparePhotoInSharedPublicPasswordProtectedAlbum(): void $this->photoID1 = $this->photos_tests->upload(static::createUploadedFile(static::SAMPLE_FILE_MONGOLIA_IMAGE), $this->albumID1)->offsetGet('id'); $this->albums_tests->set_protection_policy($this->albumID1, true, true, false, false, true, true, self::ALBUM_PWD_1); $this->sharing_tests->add([$this->albumID1], [$this->userID]); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } @@ -897,7 +909,8 @@ protected function prepareThreeAlbumsWithMixedSharingAndPasswordProtection(): vo $this->albumID3, true, true, false, true, true, true, self::ALBUM_PWD_1 ); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $this->clearCachedSmartAlbums(); $this->performPostPreparatorySteps(); } diff --git a/tests/Feature/SharingWithNonAdminUserAbstract.php b/tests/Feature/SharingWithNonAdminUserAbstract.php index 220efea2c3..6620293c86 100644 --- a/tests/Feature/SharingWithNonAdminUserAbstract.php +++ b/tests/Feature/SharingWithNonAdminUserAbstract.php @@ -12,11 +12,11 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\SmartAlbums\PublicAlbum; use App\SmartAlbums\RecentAlbum; use App\SmartAlbums\StarredAlbum; use App\SmartAlbums\UnsortedAlbum; +use Illuminate\Support\Facades\Auth; /** * Implements the tests of {@link SharingTestScenariosAbstract} for a @@ -287,7 +287,7 @@ protected function generateExpectedTreeJson(array $expectedAlbums = []): array protected function performPostPreparatorySteps(): void { - AccessControl::log_as_id($this->userID); + Auth::loginUsingId($this->userID); } protected function getExpectedInaccessibleHttpStatusCode(): int diff --git a/tests/Feature/UpdateTest.php b/tests/Feature/UpdateTest.php index c98bf1783d..68686671c3 100644 --- a/tests/Feature/UpdateTest.php +++ b/tests/Feature/UpdateTest.php @@ -12,8 +12,13 @@ namespace Tests\Feature; -use App\Facades\AccessControl; +use App\Http\Middleware\MigrationStatus; use App\Models\Configs; +use App\Models\User; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Session; +use function PHPUnit\Framework\assertEquals; use PHPUnit\Framework\ExpectationFailedException; use Tests\TestCase; @@ -35,7 +40,7 @@ public function testDoLogged(): void { $gitpull = Configs::getValue('allow_online_git_pull', '0'); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); Configs::set('allow_online_git_pull', '0'); $response = $this->postJson('/api/Update::apply'); @@ -70,6 +75,47 @@ public function testDoLogged(): void Configs::set('allow_online_git_pull', $gitpull); - AccessControl::logout(); + Auth::logout(); + Session::flush(); + } + + /** + * We check that we can apply migration. + * This requires us to disable the MigrationStatus middleware otherwise + * we will be thrown out all the time. + */ + public function testApplyMigration() + { + // Prepare for test: we need to make sure there is an admin user registered. + /** @var User $adminUser */ + $adminUser = User::findOrFail(0); + $login = $adminUser->username; + $pw = $adminUser->password; + $adminUser->username = Hash::make('test_login'); + $adminUser->password = Hash::make('test_password'); + $adminUser->save(); + + // We disable middlewares because they are not what we want to test here. + $this->withoutMiddleware(); + + // make sure we are logged out + Auth::logout(); + Session::flush(); + $response = $this->postJson('/migrate'); + $response->assertForbidden(); + + $response = $this->postJson('/migrate', ['username' => 'test_login', 'password' => 'test_password']); + $response->assertOk(); + + // check that Legacy did change the username + $adminUser = User::findOrFail(0); + assertEquals('test_login', $adminUser->username); + + // clean up + Auth::logout(); + Session::flush(); + $adminUser->username = $login; + $adminUser->password = $pw; + $adminUser->save(); } } diff --git a/tests/Feature/UsersTest.php b/tests/Feature/UsersTest.php index a0238046c8..486513abb6 100644 --- a/tests/Feature/UsersTest.php +++ b/tests/Feature/UsersTest.php @@ -12,12 +12,12 @@ namespace Tests\Feature; -use App\Facades\AccessControl; -use App\ModelFunctions\SessionFunctions; +use App\Legacy\AdminAuthentication; use App\Models\Configs; use App\SmartAlbums\PublicAlbum; use App\SmartAlbums\StarredAlbum; use App\SmartAlbums\UnsortedAlbum; +use Illuminate\Support\Facades\Auth; use Tests\Feature\Lib\AlbumsUnitTest; use Tests\Feature\Lib\SessionUnitTest; use Tests\Feature\Lib\UsersUnitTest; @@ -33,7 +33,6 @@ public function testSetLogin(): void /** * because there is no dependency injection in test cases. */ - $sessionFunctions = new SessionFunctions(); $sessions_test = new SessionUnitTest($this); $clear = false; @@ -45,9 +44,11 @@ public function testSetLogin(): void if ($configs['password'] === '' && $configs['username'] === '') { $clear = true; - $sessions_test->set_new('lychee', 'password'); + $sessions_test->set_admin('lychee', 'password'); $sessions_test->logout(); + $sessions_test->set_admin('lychee', 'password', 403, 'Admin user is already registered'); + $sessions_test->login('lychee', 'password'); $sessions_test->logout(); } else { @@ -57,7 +58,7 @@ public function testSetLogin(): void /* * We check that there are username and password set in the database */ - static::assertFalse($sessionFunctions->noLogin()); + static::assertFalse(AdminAuthentication::isAdminNotRegistered()); $sessions_test->login('foo', 'bar', 401); $sessions_test->login('lychee', 'bar', 401); @@ -126,10 +127,10 @@ public function testUsers(): void */ // 1 - AccessControl::log_as_id(0); + Auth::loginUsingId(0); // 2 - $users_test->add('test_abcd', 'test_abcd', true, true); + $users_test->add('test_abcd', 'password_abcd', true, true); // 3 $response = $users_test->list(); @@ -145,49 +146,49 @@ public function testUsers(): void ]); // 5 - $users_test->add('test_abcd', 'test_abcd', true, true, 409, 'Username already exists'); + $users_test->add('test_abcd', 'password_abcd', true, true, 409, 'Username already exists'); // 6 - $users_test->save($id, 'test_abcde', 'testing', false, true); + $users_test->save($id, 'test_abcde', 'password_testing', false, true); // 7 - $users_test->add('test_abcd2', 'test_abcd', true, true); + $users_test->add('test_abcd2', 'password_abcd', true, true); $response = $users_test->list(); $t = json_decode($response->getContent()); $id2 = end($t)->id; // 8 - $users_test->save($id2, 'test_abcde', 'testing', false, true, 409, 'Username already exists'); + $users_test->save($id2, 'test_abcde', 'password_testing', false, true, 409, 'Username already exists'); // 9 $sessions_test->logout(); // 10 - $sessions_test->login('test_abcde', 'testing'); + $sessions_test->login('test_abcde', 'password_testing'); // 11 $users_test->list(403); // 12 - $sessions_test->set_new('test_abcde', 'testing2', 403, 'Account is locked'); + $sessions_test->update_login('test_abcde', 'password_testing2', '', 422, 'The old password field is required.'); // 13 - $sessions_test->set_old('test_abcde', 'testing2', 'test_abcde', 'testing2', 403, 'Account is locked'); + $sessions_test->update_login('test_abcde', 'password_testing2', 'password_testing2', 403, 'Insufficient privileges'); // 14 $sessions_test->logout(); // 15 - AccessControl::log_as_id(0); + Auth::loginUsingId(0); // 16 - $users_test->save($id, 'test_abcde', 'testing', false, false); + $users_test->save($id, 'test_abcde', 'password_testing', false, false); // 17 $sessions_test->logout(); // 18 - $sessions_test->login('test_abcde', 'testing'); + $sessions_test->login('test_abcde', 'password_testing'); $sessions_test->init(); $this->clearCachedSmartAlbums(); @@ -201,28 +202,28 @@ public function testUsers(): void $album_tests->get(UnsortedAlbum::ID, 403); // 22 - $sessions_test->set_new('test_abcde', 'testing2', 401, 'Previous username or password are invalid'); + $sessions_test->update_login('test_abcde', 'password_testing2', '', 422, 'The old password field is required.'); // 23 - $sessions_test->set_old('test_abcde', 'testing2', 'test_abcde', 'testing2', 401, 'Previous username or password are invalid'); + $sessions_test->update_login('test_abcde', 'password_testing2', 'password_testing2', 401, 'Previous password is invalid'); // 24 - $sessions_test->set_old('test_abcd2', 'testing2', 'test_abcde', 'testing2', 409, 'Username already exists'); + $sessions_test->update_login('test_abcd2', 'password_testing2', 'password_testing', 409, 'Username already exists'); // 25 - $sessions_test->set_old('test_abcdef', 'testing2', 'test_abcde', 'testing'); + $sessions_test->update_login('test_abcdef', 'password_testing2', 'password_testing'); // 26 $sessions_test->logout(); // 27 - $sessions_test->login('test_abcdef', 'testing2'); + $sessions_test->login('test_abcdef', 'password_testing2'); // 28 $sessions_test->logout(); // 29 - AccessControl::log_as_id(0); + Auth::loginUsingId(0); // 30 $users_test->delete($id); @@ -238,7 +239,7 @@ public function testUsers(): void $sessions_test->logout(); // 32 - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $configs = Configs::get(); $store_new_photos_notification = $configs['new_photos_notification']; diff --git a/tests/Feature/WebAuthTest.php b/tests/Feature/WebAuthTest.php index b42747b869..3c4c6e8cc9 100644 --- a/tests/Feature/WebAuthTest.php +++ b/tests/Feature/WebAuthTest.php @@ -12,9 +12,10 @@ namespace Tests\Feature; -use App\Facades\AccessControl; use App\Models\User; use DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Session; use Tests\TestCase; class WebAuthTest extends TestCase @@ -26,7 +27,7 @@ class WebAuthTest extends TestCase */ public function testWebAuthTest(): void { - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/WebAuthn::register/gen'); $response->assertOk(); @@ -42,7 +43,8 @@ public function testWebAuthTest(): void ]); $response->assertForbidden(); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $response = $this->postJson('/api/WebAuthn::login/gen', ['user_id' => 0]); $response->assertOk(); @@ -60,7 +62,7 @@ public function testWebAuthTest(): void ]); $response->assertUnauthorized(); - AccessControl::log_as_id(0); + Auth::loginUsingId(0); $response = $this->postJson('/api/WebAuthn::list'); $response->assertOk(); // code 200 something @@ -82,9 +84,10 @@ public function testWebAuthTest(): void $response = $this->postJson('/api/WebAuthn::delete', ['id' => '1234']); $response->assertNoContent(); - AccessControl::logout(); + Auth::logout(); + Session::flush(); $response = $this->postJson('/api/WebAuthn::delete', ['id' => '1234']); - $response->assertUnauthorized(); + $response->assertForbidden(); } } diff --git a/version.md b/version.md index ae6e65bd96..6016e8addc 100644 --- a/version.md +++ b/version.md @@ -1 +1 @@ -4.5.3 \ No newline at end of file +4.6.0