-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Added multi auth database session handler
- Renamed PasswordUpdateSchema to PasswordResetsSchema
- Loading branch information
Showing
14 changed files
with
620 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
<?php | ||
|
||
namespace Javaabu\Auth; | ||
|
||
use Closure; | ||
use Detection\MobileDetect; | ||
|
||
/** | ||
* @copyright Originally created by Jens Segers: https://github.com/jenssegers/agent | ||
* Copied from https://github.com/laravel/jetstream | ||
*/ | ||
class Agent extends MobileDetect | ||
{ | ||
/** | ||
* List of additional operating systems. | ||
* | ||
* @var array<string, string> | ||
*/ | ||
protected static $additionalOperatingSystems = [ | ||
'Windows' => 'Windows', | ||
'Windows NT' => 'Windows NT', | ||
'OS X' => 'Mac OS X', | ||
'Debian' => 'Debian', | ||
'Ubuntu' => 'Ubuntu', | ||
'Macintosh' => 'PPC', | ||
'OpenBSD' => 'OpenBSD', | ||
'Linux' => 'Linux', | ||
'ChromeOS' => 'CrOS', | ||
]; | ||
|
||
/** | ||
* List of additional browsers. | ||
* | ||
* @var array<string, string> | ||
*/ | ||
protected static $additionalBrowsers = [ | ||
'Opera Mini' => 'Opera Mini', | ||
'Opera' => 'Opera|OPR', | ||
'Edge' => 'Edge|Edg', | ||
'Coc Coc' => 'coc_coc_browser', | ||
'UCBrowser' => 'UCBrowser', | ||
'Vivaldi' => 'Vivaldi', | ||
'Chrome' => 'Chrome', | ||
'Firefox' => 'Firefox', | ||
'Safari' => 'Safari', | ||
'IE' => 'MSIE|IEMobile|MSIEMobile|Trident/[.0-9]+', | ||
'Netscape' => 'Netscape', | ||
'Mozilla' => 'Mozilla', | ||
'WeChat' => 'MicroMessenger', | ||
]; | ||
|
||
/** | ||
* Key value store for resolved strings. | ||
* | ||
* @var array<string, mixed> | ||
*/ | ||
protected $store = []; | ||
|
||
/** | ||
* Get the platform name from the User Agent. | ||
* | ||
* @return string|null | ||
*/ | ||
public function platform() | ||
{ | ||
return $this->retrieveUsingCacheOrResolve('javaabu-auth.platform', function () { | ||
return $this->findDetectionRulesAgainstUserAgent( | ||
$this->mergeRules(MobileDetect::getOperatingSystems(), static::$additionalOperatingSystems) | ||
); | ||
}); | ||
} | ||
|
||
/** | ||
* Get the browser name from the User Agent. | ||
* | ||
* @return string|null | ||
*/ | ||
public function browser() | ||
{ | ||
return $this->retrieveUsingCacheOrResolve('javaabu-auth.browser', function () { | ||
return $this->findDetectionRulesAgainstUserAgent( | ||
$this->mergeRules(static::$additionalBrowsers, MobileDetect::getBrowsers()) | ||
); | ||
}); | ||
} | ||
|
||
/** | ||
* Determine if the device is a desktop computer. | ||
* | ||
* @return bool | ||
*/ | ||
public function isDesktop() | ||
{ | ||
return $this->retrieveUsingCacheOrResolve('javaabu-auth.desktop', function () { | ||
// Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' | ||
if ( | ||
$this->getUserAgent() === static::$cloudFrontUA | ||
&& $this->getHttpHeader('HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER') === 'true' | ||
) { | ||
return true; | ||
} | ||
|
||
return ! $this->isMobile() && ! $this->isTablet(); | ||
}); | ||
} | ||
|
||
/** | ||
* Match a detection rule and return the matched key. | ||
* | ||
* @return string|null | ||
*/ | ||
protected function findDetectionRulesAgainstUserAgent(array $rules) | ||
{ | ||
$userAgent = $this->getUserAgent(); | ||
|
||
foreach ($rules as $key => $regex) { | ||
if (empty($regex)) { | ||
continue; | ||
} | ||
|
||
if ($this->match($regex, $userAgent)) { | ||
return $key ?: reset($this->matchesArray); | ||
} | ||
} | ||
|
||
return null; | ||
} | ||
|
||
/** | ||
* Retrieve from the given key from the cache or resolve the value. | ||
* | ||
* @param string $key | ||
* @param \Closure():mixed $callback | ||
* @return mixed | ||
*/ | ||
protected function retrieveUsingCacheOrResolve(string $key, Closure $callback) | ||
{ | ||
$cacheKey = $this->createCacheKey($key); | ||
|
||
if (! is_null($cacheItem = $this->store[$cacheKey] ?? null)) { | ||
return $cacheItem; | ||
} | ||
|
||
return tap(call_user_func($callback), function ($result) use ($cacheKey) { | ||
$this->store[$cacheKey] = $result; | ||
}); | ||
} | ||
|
||
/** | ||
* Merge multiple rules into one array. | ||
* | ||
* @param array $all | ||
* @return array<string, string> | ||
*/ | ||
protected function mergeRules(...$all) | ||
{ | ||
$merged = []; | ||
|
||
foreach ($all as $rules) { | ||
foreach ($rules as $key => $value) { | ||
if (empty($merged[$key])) { | ||
$merged[$key] = $value; | ||
} elseif (is_array($merged[$key])) { | ||
$merged[$key][] = $value; | ||
} else { | ||
$merged[$key] .= '|'.$value; | ||
} | ||
} | ||
} | ||
|
||
return $merged; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 2 additions & 2 deletions
4
src/PasswordUpdate/PasswordUpdateSchema.php → src/PasswordResetsSchema.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
<?php | ||
|
||
namespace Javaabu\Auth\Session; | ||
|
||
use Illuminate\Contracts\Auth\Guard; | ||
use Illuminate\Database\Eloquent\Model; | ||
use Illuminate\Session\DatabaseSessionHandler; | ||
|
||
class MultiAuthDatabaseSessionHandler extends DatabaseSessionHandler | ||
{ | ||
protected function addUserInformation(&$payload) | ||
{ | ||
if ($this->container->bound(Guard::class) && ($user_type = $this->userType())) { | ||
$payload['user_id'] = $this->userId(); | ||
$payload['user_type'] = $this->userType(); | ||
} | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Get the currently authenticated user. | ||
* | ||
* @return mixed | ||
*/ | ||
protected function userType(): ?string | ||
{ | ||
$user = $this->container->make(Guard::class)->user(); | ||
|
||
if ($user instanceof Model) { | ||
return $user->getMorphClass(); | ||
} | ||
|
||
return null; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
<?php | ||
|
||
namespace Javaabu\Auth\Session; | ||
|
||
use Illuminate\Database\Eloquent\Model; | ||
use Illuminate\Database\Eloquent\Relations\MorphTo; | ||
use Javaabu\Auth\Agent; | ||
|
||
class Session extends Model | ||
{ | ||
public $incrementing = false; | ||
|
||
public $timestamps = false; | ||
|
||
/** | ||
* The attributes that are cast to native types | ||
* | ||
* @var array | ||
*/ | ||
protected $casts = [ | ||
'last_activity' => 'datetime' | ||
]; | ||
|
||
|
||
public function __construct(array $attributes = []) | ||
{ | ||
$this->table = config('session.table'); | ||
$this->connection = config('session.connection'); | ||
|
||
parent::__construct($attributes); | ||
} | ||
|
||
public function getAgentAttribute(): Agent | ||
{ | ||
return $this->createAgent(); | ||
} | ||
|
||
public function getIsCurrentDeviceAttribute(): bool | ||
{ | ||
return $this->id === request()->session()->getId(); | ||
} | ||
|
||
public function user(): MorphTo | ||
{ | ||
return $this->morphTo('user'); | ||
} | ||
|
||
/** | ||
* Create a new agent instance from the given session. | ||
* | ||
* @return Agent | ||
*/ | ||
protected function createAgent(): Agent | ||
{ | ||
return tap(new Agent(), fn ($agent) => $agent->setUserAgent($this->user_agent)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<?php | ||
|
||
namespace Javaabu\Auth\Session; | ||
|
||
use Illuminate\Database\Schema\Blueprint; | ||
|
||
class SessionSchema | ||
{ | ||
/** | ||
* Adds the columns needed for email verification | ||
*/ | ||
public static function columns(Blueprint $table): void | ||
{ | ||
$table->string('id')->primary(); | ||
$table->nullableMorphs('user'); | ||
$table->string('ip_address', 45)->nullable(); | ||
$table->text('user_agent')->nullable(); | ||
$table->longText('payload'); | ||
$table->integer('last_activity')->index(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.