Файл: gapps/vendor/cartalyst/sentinel/src/Laravel/SentinelServiceProvider.php
Строк: 589
<?php
/**
* Part of the Sentinel package.
*
* NOTICE OF LICENSE
*
* Licensed under the 3-clause BSD License.
*
* This source file is subject to the 3-clause BSD License that is
* bundled with this package in the LICENSE file.
*
* @package Sentinel
* @version 2.0.15
* @author Cartalyst LLC
* @license BSD License (3-clause)
* @copyright (c) 2011-2017, Cartalyst LLC
* @link http://cartalyst.com
*/
namespace CartalystSentinelLaravel;
use CartalystSentinelActivationsIlluminateActivationRepository;
use CartalystSentinelCheckpointsActivationCheckpoint;
use CartalystSentinelCheckpointsThrottleCheckpoint;
use CartalystSentinelCookiesIlluminateCookie;
use CartalystSentinelHashingNativeHasher;
use CartalystSentinelPersistencesIlluminatePersistenceRepository;
use CartalystSentinelRemindersIlluminateReminderRepository;
use CartalystSentinelRolesIlluminateRoleRepository;
use CartalystSentinelSentinel;
use CartalystSentinelSessionsIlluminateSession;
use CartalystSentinelThrottlingIlluminateThrottleRepository;
use CartalystSentinelUsersIlluminateUserRepository;
use Exception;
use IlluminateSupportServiceProvider;
use InvalidArgumentException;
use SymfonyComponentHttpFoundationResponse;
class SentinelServiceProvider extends ServiceProvider
{
/**
* {@inheritDoc}
*/
public function boot()
{
$this->garbageCollect();
}
/**
* {@inheritDoc}
*/
public function register()
{
$this->prepareResources();
$this->setOverrides();
$this->registerPersistences();
$this->registerUsers();
$this->registerRoles();
$this->registerCheckpoints();
$this->registerReminders();
$this->registerSentinel();
$this->setUserResolver();
}
/**
* Prepare the package resources.
*
* @return void
*/
protected function prepareResources()
{
// Publish config
$config = realpath(__DIR__.'/../config/config.php');
$this->mergeConfigFrom($config, 'cartalyst.sentinel');
$this->publishes([
$config => config_path('cartalyst.sentinel.php'),
], 'config');
// Publish migrations
$migrations = realpath(__DIR__.'/../migrations');
$this->publishes([
$migrations => $this->app->databasePath().'/migrations',
], 'migrations');
}
/**
* Registers the persistences.
*
* @return void
*/
protected function registerPersistences()
{
$this->registerSession();
$this->registerCookie();
$this->app->singleton('sentinel.persistence', function ($app) {
$config = $app['config']->get('cartalyst.sentinel.persistences');
return new IlluminatePersistenceRepository(
$app['sentinel.session'], $app['sentinel.cookie'], $config['model'], $config['single']
);
});
}
/**
* Registers the session.
*
* @return void
*/
protected function registerSession()
{
$this->app->singleton('sentinel.session', function ($app) {
return new IlluminateSession(
$app['session.store'], $app['config']->get('cartalyst.sentinel.session')
);
});
}
/**
* Registers the cookie.
*
* @return void
*/
protected function registerCookie()
{
$this->app->singleton('sentinel.cookie', function ($app) {
return new IlluminateCookie(
$app['request'], $app['cookie'], $app['config']->get('cartalyst.sentinel.cookie')
);
});
}
/**
* Registers the users.
*
* @return void
*/
protected function registerUsers()
{
$this->registerHasher();
$this->app->singleton('sentinel.users', function ($app) {
$config = $app['config']->get('cartalyst.sentinel.users');
return new IlluminateUserRepository(
$app['sentinel.hasher'], $app['events'], $config['model']
);
});
}
/**
* Registers the hahser.
*
* @return void
*/
protected function registerHasher()
{
$this->app->singleton('sentinel.hasher', function () {
return new NativeHasher;
});
}
/**
* Registers the roles.
*
* @return void
*/
protected function registerRoles()
{
$this->app->singleton('sentinel.roles', function ($app) {
$config = $app['config']->get('cartalyst.sentinel.roles');
return new IlluminateRoleRepository($config['model']);
});
}
/**
* Registers the checkpoints.
*
* @return void
* @throws InvalidArgumentException
*/
protected function registerCheckpoints()
{
$this->registerActivationCheckpoint();
$this->registerThrottleCheckpoint();
$this->app->singleton('sentinel.checkpoints', function ($app) {
$activeCheckpoints = $app['config']->get('cartalyst.sentinel.checkpoints');
$checkpoints = [];
foreach ($activeCheckpoints as $checkpoint) {
if (! $app->offsetExists("sentinel.checkpoint.{$checkpoint}")) {
throw new InvalidArgumentException("Invalid checkpoint [$checkpoint] given.");
}
$checkpoints[$checkpoint] = $app["sentinel.checkpoint.{$checkpoint}"];
}
return $checkpoints;
});
}
/**
* Registers the activation checkpoint.
*
* @return void
*/
protected function registerActivationCheckpoint()
{
$this->registerActivations();
$this->app->singleton('sentinel.checkpoint.activation', function ($app) {
return new ActivationCheckpoint($app['sentinel.activations']);
});
}
/**
* Registers the activations.
*
* @return void
*/
protected function registerActivations()
{
$this->app->singleton('sentinel.activations', function ($app) {
$config = $app['config']->get('cartalyst.sentinel.activations');
return new IlluminateActivationRepository($config['model'], $config['expires']);
});
}
/**
* Registers the throttle checkpoint.
*
* @return void
*/
protected function registerThrottleCheckpoint()
{
$this->registerThrottling();
$this->app->singleton('sentinel.checkpoint.throttle', function ($app) {
return new ThrottleCheckpoint(
$app['sentinel.throttling'], $app['request']->getClientIp()
);
});
}
/**
* Registers the throttle.
*
* @return void
*/
protected function registerThrottling()
{
$this->app->singleton('sentinel.throttling', function ($app) {
$model = $app['config']->get('cartalyst.sentinel.throttling.model');
$throttling = $app['config']->get('cartalyst.sentinel.throttling');
foreach ([ 'global', 'ip', 'user' ] as $type) {
${"{$type}Interval"} = $throttling[$type]['interval'];
${"{$type}Thresholds"} = $throttling[$type]['thresholds'];
}
return new IlluminateThrottleRepository(
$model,
$globalInterval,
$globalThresholds,
$ipInterval,
$ipThresholds,
$userInterval,
$userThresholds
);
});
}
/**
* Registers the reminders.
*
* @return void
*/
protected function registerReminders()
{
$this->app->singleton('sentinel.reminders', function ($app) {
$config = $app['config']->get('cartalyst.sentinel.reminders');
return new IlluminateReminderRepository(
$app['sentinel.users'], $config['model'], $config['expires']
);
});
}
/**
* Registers sentinel.
*
* @return void
*/
protected function registerSentinel()
{
$this->app->singleton('sentinel', function ($app) {
$sentinel = new Sentinel(
$app['sentinel.persistence'],
$app['sentinel.users'],
$app['sentinel.roles'],
$app['sentinel.activations'],
$app['events']
);
if (isset($app['sentinel.checkpoints'])) {
foreach ($app['sentinel.checkpoints'] as $key => $checkpoint) {
$sentinel->addCheckpoint($key, $checkpoint);
}
}
$sentinel->setActivationRepository($app['sentinel.activations']);
$sentinel->setReminderRepository($app['sentinel.reminders']);
$sentinel->setRequestCredentials(function () use ($app) {
$request = $app['request'];
$login = $request->getUser();
$password = $request->getPassword();
if ($login === null && $password === null) {
return;
}
return compact('login', 'password');
});
$sentinel->creatingBasicResponse(function () {
$headers = ['WWW-Authenticate' => 'Basic'];
return new Response('Invalid credentials.', 401, $headers);
});
return $sentinel;
});
$this->app->alias('sentinel', 'CartalystSentinelSentinel');
}
/**
* {@inheritDoc}
*/
public function provides()
{
return [
'sentinel.session',
'sentinel.cookie',
'sentinel.persistence',
'sentinel.hasher',
'sentinel.users',
'sentinel.roles',
'sentinel.activations',
'sentinel.checkpoint.activation',
'sentinel.throttling',
'sentinel.checkpoint.throttle',
'sentinel.checkpoints',
'sentinel.reminders',
'sentinel',
];
}
/**
* Garbage collect activations and reminders.
*
* @return void
*/
protected function garbageCollect()
{
$config = $this->app['config']->get('cartalyst.sentinel');
$this->sweep(
$this->app['sentinel.activations'], $config['activations']['lottery']
);
$this->sweep(
$this->app['sentinel.reminders'], $config['reminders']['lottery']
);
}
/**
* Sweep expired codes.
*
* @param mixed $repository
* @param array $lottery
* @return void
*/
protected function sweep($repository, array $lottery)
{
if ($this->configHitsLottery($lottery)) {
try {
$repository->removeExpired();
} catch (Exception $e) {
}
}
}
/**
* Determine if the configuration odds hit the lottery.
*
* @param array $lottery
* @return bool
*/
protected function configHitsLottery(array $lottery)
{
return mt_rand(1, $lottery[1]) <= $lottery[0];
}
/**
* Sets the user resolver on the request class.
*
* @return void
*/
protected function setUserResolver()
{
$this->app->rebinding('request', function ($app, $request) {
$request->setUserResolver(function () use ($app) {
return $app['sentinel']->getUser();
});
});
}
/**
* Performs the necessary overrides.
*
* @return void
*/
protected function setOverrides()
{
$config = $this->app['config']->get('cartalyst.sentinel');
$users = $config['users']['model'];
$roles = $config['roles']['model'];
$persistences = $config['persistences']['model'];
if (class_exists($users)) {
if (method_exists($users, 'setRolesModel')) {
forward_static_call_array([ $users, 'setRolesModel' ], [ $roles ]);
}
if (method_exists($users, 'setPersistencesModel')) {
forward_static_call_array([ $users, 'setPersistencesModel' ], [ $persistences ]);
}
if (method_exists($users, 'setPermissionsClass')) {
forward_static_call_array([ $users, 'setPermissionsClass' ], [ $config['permissions']['class'] ]);
}
}
if (class_exists($roles) && method_exists($roles, 'setUsersModel')) {
forward_static_call_array([ $roles, 'setUsersModel' ], [ $users ]);
}
if (class_exists($persistences) && method_exists($persistences, 'setUsersModel')) {
forward_static_call_array([ $persistences, 'setUsersModel' ], [ $users ]);
}
}
}