* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Flarum\Core; use Flarum\Core\Access\Gate; use Flarum\Core\Post\CommentPost; use Flarum\Event\ConfigurePostTypes; use Flarum\Event\ConfigureUserPreferences; use Flarum\Event\GetPermission; use Flarum\Foundation\AbstractServiceProvider; use Illuminate\Contracts\Container\Container; use RuntimeException; class CoreServiceProvider extends AbstractServiceProvider { /** * {@inheritdoc} */ public function register() { $this->app->singleton('flarum.gate', function ($app) { return new Gate($app, function () { throw new RuntimeException('You must set the gate user with forUser()'); }); }); $this->app->alias('flarum.gate', 'Illuminate\Contracts\Auth\Access\Gate'); $this->app->alias('flarum.gate', 'Flarum\Core\Access\Gate'); $this->registerAvatarsFilesystem(); $this->app->register('Flarum\Core\Notification\NotificationServiceProvider'); $this->app->register('Flarum\Core\Search\SearchServiceProvider'); $this->app->register('Flarum\Formatter\FormatterServiceProvider'); } protected function registerAvatarsFilesystem() { $avatarsFilesystem = function (Container $app) { return $app->make('Illuminate\Contracts\Filesystem\Factory')->disk('flarum-avatars')->getDriver(); }; $this->app->when('Flarum\Core\Command\UploadAvatarHandler') ->needs('League\Flysystem\FilesystemInterface') ->give($avatarsFilesystem); $this->app->when('Flarum\Core\Command\DeleteAvatarHandler') ->needs('League\Flysystem\FilesystemInterface') ->give($avatarsFilesystem); } /** * {@inheritdoc} */ public function boot() { $this->loadViewsFrom(__DIR__.'/../../views', 'flarum'); $this->app->make('Illuminate\Contracts\Bus\Dispatcher')->mapUsing(function ($command) { return get_class($command).'Handler@handle'; }); $this->app->make('flarum.gate')->before(function (User $actor, $ability, $model = null) { if ($actor->isAdmin() || (! $model && $actor->hasPermission($ability))) { return true; } return $this->app->make('events')->until( new GetPermission($actor, $ability, [$model]) ); }); $this->registerPostTypes(); CommentPost::setFormatter($this->app->make('flarum.formatter')); User::setHasher($this->app->make('hash')); User::setGate($this->app->make('flarum.gate')); $events = $this->app->make('events'); $events->subscribe('Flarum\Core\Listener\DiscussionMetadataUpdater'); $events->subscribe('Flarum\Core\Listener\UserMetadataUpdater'); $events->subscribe('Flarum\Core\Listener\EmailConfirmationMailer'); $events->subscribe('Flarum\Core\Listener\DiscussionRenamedNotifier'); $events->subscribe('Flarum\Core\Listener\FloodController'); $events->subscribe('Flarum\Core\Access\DiscussionPolicy'); $events->subscribe('Flarum\Core\Access\GroupPolicy'); $events->subscribe('Flarum\Core\Access\PostPolicy'); $events->subscribe('Flarum\Core\Access\UserPolicy'); $events->listen(ConfigureUserPreferences::class, [$this, 'configureUserPreferences']); } public function registerPostTypes() { $models = [ 'Flarum\Core\Post\CommentPost', 'Flarum\Core\Post\DiscussionRenamedPost' ]; $this->app->make('events')->fire( new ConfigurePostTypes($models) ); foreach ($models as $model) { Post::setModel($model::$type, $model); } } /** * @param ConfigureUserPreferences $event */ public function configureUserPreferences(ConfigureUserPreferences $event) { $event->add('discloseOnline', 'boolval', true); $event->add('indexProfile', 'boolval', true); $event->add('locale'); } }