JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrmergeConfig(); $this->app->bind(ImpersonateManager::class, ImpersonateManager::class); $this->app->singleton(ImpersonateManager::class, function ($app) { return new ImpersonateManager($app); }); $this->app->alias(ImpersonateManager::class, 'impersonate'); $this->registerRoutesMacro(); $this->registerBladeDirectives(); $this->registerMiddleware(); $this->registerAuthDriver(); } /** * Bootstrap the application events. * * @return void */ public function boot() { $this->publishConfig(); // We want to remove data from storage on real login and logout Event::listen(Login::class, function ($event) { app('impersonate')->clear(); }); Event::listen(Logout::class, function ($event) { app('impersonate')->clear(); }); } /** * Register plugin blade directives. * * @param void * @return void */ protected function registerBladeDirectives() { $this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) { $bladeCompiler->directive('impersonating', function ($guard = null) { return ""; }); $bladeCompiler->directive('endImpersonating', function () { return ''; }); $bladeCompiler->directive('canImpersonate', function ($guard = null) { return ""; }); $bladeCompiler->directive('endCanImpersonate', function () { return ''; }); $bladeCompiler->directive('canBeImpersonated', function ($expression) { $args = preg_split("/,(\s+)?/", $expression); $guard = $args[1] ?? null; return ""; }); $bladeCompiler->directive('endCanBeImpersonated', function () { return ''; }); }); } /** * Register routes macro. * * @param void * @return void */ protected function registerRoutesMacro() { $router = $this->app['router']; $router->macro('impersonate', function () use ($router) { $router->get('/impersonate/take/{id}/{guardName?}', '\Lab404\Impersonate\Controllers\ImpersonateController@take')->name('impersonate'); $router->get('/impersonate/leave', '\Lab404\Impersonate\Controllers\ImpersonateController@leave')->name('impersonate.leave'); }); } /** * @param void * @return void */ protected function registerAuthDriver() { /** @var AuthManager $auth */ $auth = $this->app['auth']; $auth->extend('session', function (Application $app, $name, array $config) use ($auth) { $provider = $auth->createUserProvider($config['provider']); $guard = new SessionGuard($name, $provider, $app['session.store']); if (method_exists($guard, 'setCookieJar')) { $guard->setCookieJar($app['cookie']); } if (method_exists($guard, 'setDispatcher')) { $guard->setDispatcher($app['events']); } if (method_exists($guard, 'setRequest')) { $guard->setRequest($app->refresh('request', $guard, 'setRequest')); } return $guard; }); } /** * Register plugin middleware. * * @param void * @return void */ public function registerMiddleware() { $this->app['router']->aliasMiddleware('impersonate.protect', ProtectFromImpersonation::class); } /** * Merge config file. * * @param void * @return void */ protected function mergeConfig() { $configPath = __DIR__ . '/../config/' . $this->configName . '.php'; $this->mergeConfigFrom($configPath, $this->configName); } /** * Publish config file. * * @param void * @return void */ protected function publishConfig() { $configPath = __DIR__ . '/../config/' . $this->configName . '.php'; $this->publishes([$configPath => config_path($this->configName . '.php')], 'impersonate'); } }